我正在尝试在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)
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
slsoa <- unionSpatialPolygons(soa, lookup$$LSOA11CD)
Run Code Online (Sandbox Code Playgroud)
但我的理解是,由于我安装了(R)GEOS,因此无论如何都使用了rgeos包中的gUnion方法.
所以,我的问题是溶解似乎有效; 我没有收到错误消息,而length()函数表明我现在有更少的多边形:
length(soa@polygons) # 1,817
length(slsoa@polygons) # should be 338
Run Code Online (Sandbox Code Playgroud)
但是这些图看起来是相同的(即内部溶解没有起作用),如以下两个图所示:
plot(soa)
plot(slsoa)
Run Code Online (Sandbox Code Playgroud)
我环顾了一下互联网和stackoverflow,看看我是否可以解决我的问题,发现了几篇但没有成功的文章.
有没有人知道我做错了什么以及为什么情节不正常?
非常感谢.
首先,你的soashapefile有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)
Run Code Online (Sandbox Code Playgroud)
