R中的缓冲区和并集,而不减少为多多边形


9

我想执行空间叠加以识别一组点落入的多边形。但是,我首先要缓冲和溶解多边形,以使落入合并多边形内任意位置(而不是任何孔内)的点将通过叠加过程进行类似标记。

不幸的是,我正在使用的缓冲和/或溶解过程将SpatialPolygons对象简化为多面体。在时使用gBuffer会创建一个多面byid=FALSE,但在时无法合并重叠的多边形byid=TRUE。在后一种情况下,随后gUnaryUnion再次将其溶解会创建一个多多边形。SpatialPoints用这些多面叠加会导致所有包含的点都报告为落在面1内。

这是一个带有缓冲点的相关玩具示例,在这里我想用缓冲多边形对这些点进行覆盖:

library(sp)
library(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
plot(gBuffer(pts, width=0.6), lwd=2)
points(pts, pch=20, cex=2)
text(coordinates(pts), labels=seq_len(length(pts)), pos=4, font=2)

在此处输入图片说明

还有一些叠加的结果...

  • byid=FALSE

    b <- gBuffer(pts, width=0.6) 
    over(pts, b)
    # [1] 1 1 1 1
  • byid=TRUE

    b2 <- gBuffer(pts, width=0.6, byid=TRUE) 
    over(pts, b2)
    # [1] 1 2 3 4
  • 随着byid=TRUE和后续gUnaryUnion

    b3 <- gUnaryUnion(b2)
    over(pts, b3)
    # [1] 1 1 1 1

我正在寻找实现结果的正确方法1 1 1 2,即点1、2和3落在多边形1内(先前已合并的多边形1、2和3),点4落在多边形2内(最初是多边形4 )。


编辑

我的真实数据包括漏洞,理想情况下,我希望能够保留这些漏洞。我已经更新了上面的示例数据,以在缓冲后包含一个孔。

将@JeffreyEvans的方法应用于这些polys:

polys <- b@polygons[[1]]@Polygons
pl <- vector("list", length(polys))
for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
b.spolys <- SpatialPolygons(pl)
row.ids <- sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))    
b.exploded <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids))) 

结果是:

over(pts, b.exploded)

#   FID
# 1   2
# 2   2
# 3   2
# 4   1

这是预期的结果(我对多边形的顺序不太感兴趣-vs 2,2,2,1. 1,1,1,2),但是b.exploded丢失了有关孔的信息,而是将其表示为非孔多边形。它显然不会影响玩具示例的结果,但是涉及位于孔中的点的覆盖层将产生误导,例如:

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
#   FID
# 1   2

Answers:


7

事实证明,sp::disaggregate可用于拉开单面多边形。

pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
b <- gBuffer(pts, width=0.6) 
over(pts, disaggregate(b))

# [1] 1 1 1 2

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, disaggregate(b))

# [1] NA

raster::aggregate可用于再次组合它们。)


3

我很同情,这有点痛苦。您必须将gBuffer多边形对象的插槽分解为单个多边形。

require(sp)
require(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 3), c(1, 2, 3))) 

b <- gBuffer(pts, width=0.6)

over(pts, b)

###########################################################
# explodes slots into individual polygons
polys <- b@polygons[[1]]@Polygons
  pl <- vector("list", length(polys))
    for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
      b.spolys <- SpatialPolygons(pl)
        row.ids=sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))    
b <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)) ) 
###########################################################

over(pts, b)

刚刚测试过,似乎很有希望,但是我的漏洞不再是漏洞:(。我们是否可以调整它以使其与关联的多边形保持在一起?(我正沿着类似的路线为你的建议的标题,用n <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))...我应该提到在后孔的问题,对不起。
jbaums
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.