我有一个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)
唯一sa$id
的数量(4500)与唯一b$SMALL_AREA
的数量(4500行)相同。 (例如)ID和22如何从sa
映射到b
中正确的小区域?
sa中有56k行,b中有4500行
任何建议都值得赞赏
我正在R中工作
Shapefiles使用R中的sf
包更容易使用和理解。它通过添加$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)