将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的多边形。

我已经尝试过光栅包的并集或相交功能,但只能获得多边形重叠的信息,而不能获得求和和和合并的信息。此外,我正在明确寻求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

最新更新