2016-06-07 74 views
0

我有一個包含許多部分重疊的SpatialPolygons的形狀文件。這些多邊形屬於田間殺菌劑的應用,並且每個多邊形具有作爲屬性的相關應用率。在R SpatialPolygonsDataFrame中重疊多邊形的屬性值R

我想要得到的是糾正AsApplied地圖,考慮到重疊區域意味着如果兩個(或多個)多邊形重疊,應該對比率進行彙總和合並。

下面的示例代碼創建了一個SpatialPolygonsDataFrame簡化了問題:

library(raster) 
library(sp) 

p<-SpatialPolygons(list(Polygons(list(Polygon(cbind(c(1,4,4,3,3,1,1),c(1,1,3,3,4,4,1)),hole = F)), "1_ "), 
        Polygons(list(Polygon(cbind(c(3,4,4,3,3),c(3,3,4,4,3)),hole = F)), "1_2"), 
        Polygons(list(Polygon(cbind(c(3,4,4,3,3),c(3,3,4,4,3)),hole = F)), "2_1"), 
        Polygons(list(Polygon(cbind(c(4,4,5,5,3,3,4),c(4,3,3,5,5,4,4)),hole = F)),"2_"))) 

pid <- sapply(slot(p, "polygons"), function(x) slot(x, "ID")) 
p.df <- data.frame(ID=1:length(p), row.names = pid) 
p <- SpatialPolygonsDataFrame(p, p.df) 
p$Rate <- c(100, 100, 100, 100) 
crs(p) <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
plot(p) 

你可以看到兩個正方形從四個多邊形這部分重疊。每個多邊形的關聯率爲100. 我想要的是三個多邊形。兩個不重疊的應該有100的比率,兩個重疊的應該被連接到一個值爲200的多邊形。

我已經嘗試了光柵包的聯合或相交功能,但只能獲得多邊形重疊的信息,而不是求和和合並。此外,我正在尋求明確的解決方案。

任何幫助解決這個問題,高度讚賞。

更新:下面RobertH提供的解決方案適用於我的簡單示例。非常感謝你!

但是切換到我真正的用例時,我得到下列類型的錯誤和警告:

Error in if (is.numeric(i) && i < 0) { : 
    missing value where TRUE/FALSE needed 
In addition: Warning messages: 
1: In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") : 
    Too few points in geometry component at or near point 8.3634020800000002 50.056772690000003 
... 

一個例子形狀文件在這裏上傳:(過時)

任何想法如何應對這個問題?

更新#2使用當前的開發版本2.5-10確實修復了RGEOSUnaryPredFunc中的警告。然而,如果多邊形只重疊非常非常少,我仍然得到錯誤:其中發生這種情況在這裏上傳

Error in if (is.numeric(i) && i < 0) { : 
    missing value where TRUE/FALSE needed 

形狀例文件:http://www.share-online.biz/dl/O4ZIVH8OBW。更精確的現場如下所示:

Image of polygon example 2

標記爲紅色的原因錯誤的兩個多邊形,如果這兩個中的一個被刪除的工會工作正常。

非常感謝您的幫助!

+0

我已經改變了代碼的速度,以便它現在的作品與您的數據。你可以嘗試開發版本:install.packages(「raster」,repos =「http://R-Forge.R-project.org」) – RobertH

+0

這修復了警告,謝謝!不幸的是,一些錯誤仍然存​​在。請在上面查看詳情。另外,由於您的命令缺少http部分,因此我使用install.packages(「raster」,repos =「http://R-Forge.R-project.org」)獲得開發版本。 – Aludra

+0

示例2適合我。也許你需要更新'rgeos'?我會很高興看到其他情況,但不會通過那些惱人的文件共享。如果你願意,你可以發郵件給我。 – RobertH

回答

0

我認爲你的確是union。它合併並識別重疊的多邊形。有了這個,你可以總結利率。

# example data 
library(raster) 
p1 <- cbind(c(1,4,4,1),c(1,1,4,4)) 
p2 <- cbind(c(3,5,5,3),c(3,3,5,5)) 
p <- spPolygons(p1, p2, crs="+proj=longlat +datum=WGS84", 
         attr=data.frame(ID=1:2, Rate =c(50,100))) 

#data.frame(p) 
# ID Rate 
#1 1 50 
#2 2 100 

首先利用工會

x <- union(p) 
ud <- data.frame(x) 
ud$count <- NULL 

總和貢獻多邊形

udRate <- t(t(ud) * p$Rate) 
x$Rate <- rowSums(udRate) 
data.frame(x) 

# ID.1 ID.2 count Rate 
#1 1 0  1 50 
#2 0 1  1 100 
#3 1 1  2 150