使用R的溶解多边形没有正确绘图

Phi*_*hil 2 gis r polygon

我正在尝试在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,看看我是否可以解决我的问题,发现了几篇但没有成功的文章.

有没有人知道我做错了什么以及为什么情节不正常?

非常感谢.

jlh*_*ard 5

首先,你的soashapefile有1817个元素,每个元素都有一个唯一的code(对应lookup$OA11CD).但是你的lookup文件只有1667行.显然,lookup 没有 "所有OA代码列表".

其次,除非lookup你的shapefile 具有相同的顺序,否则使用gUnaryUnion(...)这种方式会产生垃圾.你需要合并soa@datalookup上第一的相应字段.

第三,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)