我试图在R中执行解散。我之前在QGIS中已经完成了这项工作,但我想在R中实现这一点,以便在可能的情况下与我的其他工作流程集成。
我有一个带有小地理多边形的ESRI shapefile(输出区域,如果您熟悉英国人口普查地理)。我还提供了一个查找表,其中列出了所有OA代码及其关联的聚合地理代码。
我无法提供我正在处理的实际文件,但可比较的文件和下面的最小可重复示例:
代码:
require("rgdal") # for readOGR
require("rgeos") # for gUnion
require("maptools")
unzip("soa.zip")
soa <- readOGR(dsn = "soa", "england_oac_2011")
proj4string(soa) <- CRS("+init=epsg:27700") # British National Grid
lookup <- read.csv("oa-soa.csv")
slsoa <- gUnaryUnion(soa, id = lookup$LSOA11CD)
我也尝试过:
slsoa <- unionSpatialPolygons(soa, lookup$$LSOA11CD)
但我的理解是,由于我安装了(R)GEOS,因此无论如何都使用rgeos包中的gUnion方法。
所以,我的问题是溶解似乎有效;我没有收到错误消息,而length()函数表示我现在有更少的多边形:
length(soa@polygons) # 1,817
length(slsoa@polygons) # should be 338
但是情节似乎是相同的(即内部溶解天堂没有效果),如以下两个图所示:
plot(soa)
plot(slsoa)
我已经浏览了互联网和stackoverflow,看看我是否可以解决我的问题并找到几篇文章,但没有成功。
有没有人知道我做错了什么以及这些情节为什么不能正常工作?
非常感谢。
答案 0 :(得分:5)
首先,您的soa
shapefile有1817个元素,每个元素都有一个唯一的code
(对应于lookup$OA11CD
)。但是您的lookup
文件只有1667行。显然,lookup
不拥有“所有OA代码列表”。
其次,除非lookup
与您的shapefile 具有相同的代码,否则使用gUnaryUnion(...)
这种方式会产生垃圾。您需要先在相应字段中将soa@data
与lookup
合并。
第三,如果多边形不是连续的(显然),gUnaryUnion(...)
不能删除内部边界。
这似乎有效
soa <- merge(soa,lookup,by.x="code",by.y="OA11CD",all.x=TRUE)
slsoa <- gUnaryUnion(soa,id=soa$LSOA11CD)
length(slsoa)
# [1] 338
par(mfrow=c(1,2),mar=c(0,0,0,0))
plot(soa);plot(slsoa)