将正确的ID映射到shp文件坐标中的唯一标识符

时间:2019-05-24 20:17:59

标签: r gis rgdal

我有一个shapefile,http://census.cso.ie/censusasp/saps/boundaries/Census2011_Small_Areas_generalised20m.zip

并想要提取长/纬度,但是我不确定如何将正确的坐标映射到正确的小区域。

mycode是:

require(ggplot2)
require(proj4)
require(rgdal)

a=readOGR(....shp)
dublin = a[a$NUS3NAME=='Dublin',]
dublin=spTransform(dublin,CRS('=proj=longlat +ellps=WGS84 +datum=WGS84'))
b=data.frame(dublin)

sa=fortify(dublin,SA='SMALL_AREA')
pj=project(sa[,1:2],proj4string(dublin),inverse=TRUE)
latlon=data.frame(latdeg=pj$y,londeg=pj$x)
sa=data.frame(cbind(latlon,sa)

enter image description here

唯一sa$id的数量(4500)与唯一b$SMALL_AREA的数量(4500行)相同。 (例如)ID为22的数字如何从sa映射到b中正确的小区域?

sa中有56k行,b中有4500行

任何建议都值得赞赏

我在R工作

1 个答案:

答案 0 :(得分:0)

使用R中的sf包,Shapefiles更加易于使用和理解。它通过添加的$geometry列表列使内容保持整洁和矩形。

例如,获取都柏林地区的经纬度:

library(sf)
library(tidyverse)

a <- read_sf('Census2011_Small_Areas_generalised20m/Census2011_Small_Areas_generalised20m.shp')

# dplyr filter() works for sf objects
dublin <- a %>% filter(NUTS3NAME == 'Dublin')

# Tranform to WGS84 coordinates
dublin <- dublin %>% st_transform(st_crs(4326))

# Proof CRS has changed
st_crs(dublin)

# lat/lon coords
st_coordinates(dublin) %>% head()

在这种情况下,sf几何是MULTIPOLYGON类型的。每个观测值都有4至168个与之关联的经纬度点。如果您对每个观察都对一个点感兴趣,则质心可能是一个很好的近似值。

使用dublin %>% st_centroid()将返回所有数据,但$geometry列包含一个点。可以使用dublin %>% st_centroid %>% st_coordinates()获得仅质心点(作为矩阵)。

最后,显示shapefile的都柏林子集和各个质心点的图。小区域内有很多形状,因此很难看清。在具有较大多边形的郊区,质心应该更明显。

dublin %>% 
  st_centroid() %>% 
  ggplot() + 
  geom_sf( size = .4, color = '#FF7900')  + 
  geom_sf(data = dublin, 
          color = '#009A49', 
          fill = NA, 
          size = .2) +
  theme(panel.background = element_rect(fill = "black")) +
  coord_sf(datum = NA)

enter image description here