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

时间:2014-11-22 21:53:26

标签: r gis 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)

我也尝试过:

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,看看我是否可以解决我的问题并找到几篇文章,但没有成功。

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

非常感谢。

1 个答案:

答案 0 :(得分:5)

首先,您的soa shapefile有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)