2014-11-22 63 views
2

我試圖在R中執行溶解。我之前在QGIS中完成了這項工作,但是我希望在R中實現這一點,以儘可能與我的工作流程的其餘部分進行集成。使用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([email protected]) # 1,817 
length([email protected]) # should be 338 

但情節似乎是相同的(即內部溶解都沒有奏效),具體表現爲以下兩個圖:

plot(soa) 
plot(slsoa) 

我已經在互聯網上左顧右盼和計算器,看看我能解決我的問題,並發現了幾篇文章,但沒有成功。

有沒有人有任何想法,我做錯了,爲什麼該地塊無法正常工作?

非常感謝。

回答

5

首先,您的soa shape文件有1817個元素,每個元素具有唯一的code(對應於lookup$OA11CD)。但是您的lookup文件只有1667行。顯然,lookup不是有「所有OA代碼的列表」。

其次,除非lookup具有相同的符號,你shape文件以相同的順序,使用gUnaryUnion(...)這樣會產生垃圾。您需要先在相應的字段上合併[email protected]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) 

+0

謝謝您的回答,我知道我失去了一些東西相當明顯。這既適用於可複製的示例,也適用於我正在處理的數據。 soa/lookup的長度很有趣。我沒有注意到,他們直接從國家統計局下載,所以他們應該匹配!謝謝。 – Phil 2014-11-23 10:02:11