簡體   English   中英

帶R的SpatialPolygonsDataFrame中重疊多邊形的屬性值求和

[英]Summing values of attributes of overlapping polygons in SpatialPolygonsDataFrame with R

我有一個形狀文件,其中包含許多部分重疊的SpatialPolygon。 這些多邊形屬於殺真菌劑在田間的施用,並且每個多邊形具有關聯的施用率作為屬性。

我要獲得的是考慮到重疊區域來更正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的多邊形。

我已經嘗試了柵格數據包的並集或相交功能,但只能獲取多邊形重疊的信息,而不能求和和合並。 另外,我正在明確尋求R中的解決方案。

非常感謝您對解決此問題的任何幫助。

更新:下面提供的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 更准確地說,該字段如下所示:

多邊形示例2的圖像

用紅色標記的兩個多邊形會導致錯誤,並且如果刪除了其中兩個之一,則合並效果很好。

非常感謝您的大力幫助!

我認為您確實追求的是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM