将单个SpatialPolygons对象的多边形部分拆分

13
在 R 中,我有一个单一的 SpatialPolygons 对象(即包含数百个多边形的多多边形),我想将此 SpatialPolygons 对象拆分为 Polygons 列表(即孔应保留附加到父多边形)。
你有任何想法如何实现吗?
编辑:
使用 sp 包中提供的以下示例:
# simple example, from vignette("sp"):
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)

Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)

然后运行 out = lapply(SpP@polygons, slot, "Polygons"),我得到了一个由三个Polygons对象(即Srs1Srs2Srs3)组成的列表。

然而,我尝试解决的情况与此示例有些不同。我要分割的SpatialPolygons对象是使用RGEOS包中的gUnaryUnion函数执行几何联合的结果。如果我应用out <- lapply(merged.polygons@polygons, slot, "Polygons"),我将获得一组唯一的Polygon对象的列表(注意不是Polygons对象的列表)。换句话说,每个多边形都与其孔分开。

运行topol <- sapply(unlist(out), function(x) x@hole)

我得到:

> length(topol)
[1] 4996


> sum(topol, na.rm=TRUE)
[1] 469
根据 RGEOS v0.3-2 手册(http://cran.r-project.org/web/packages/rgeos/rgeos.pdf)的说明:
为了使rgeos正常运行,给定多边形或复合多边形几何图形中的所有空洞必须属于一个特定的多边形。SpatialPolygons类实现目前不包括此信息。为了解决这个限制,rgeos在Polygons类上使用了一个额外的注释属性,指示哪个空洞属于哪个多边形。在当前的实现下,这个注释是由数字字符串组成的,数字用空格分隔,数字的顺序对应于Polygons对象的Polygons槽中Polygon对象的顺序。0表示Polygon对象是多边形,非零数字表示Polygon对象是具有值的孔,该值表示“拥有”孔的多边形的索引。
因此,RGEOS 中的 createSPComment() 函数可能是重新聚合多边形和空洞的一种解决方法。
4个回答

15

要将多面对象分离为单个多边形(如果存在孔,则带有孔),可以执行以下操作

d <- disaggregate(p)

其中pSpatialPolygons对象。之后,您可以使用d@polygons

例如

library(sp)
library(raster)
### example data
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20))
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20))
p1 <- list(p1, hole)
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0))
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0))
pols <- spPolygons(p1, p2, p3)
###

a <- aggregate(pols, dissolve=FALSE)
d <- disaggregate(a)

3
据我理解,OP想将一个 SpatialPolygons 对象转换为一个 Polygons 列表,如果有孔,则保留孔。
由 OP 创建的 SpP 对象包含三个多边形,其中第三个带有关联孔。
您可以使用 lapply 遍历每个包含在 SpP 中的多边形,返回一个 SpatialPolygons 列表。 PolygonsSpatialPolygons 对象之间的区别在于添加了绘图顺序信息。 然而,由于每个生成的 SpatialPolygons 的长度为1,因此此信息是多余的。
n_poly <- length(SpP)

out <- lapply(1:n_poly, function(i) SpP[i, ])

lapply(out, class)

> lapply(out, class)
   [[1]]
   [1] "SpatialPolygons"
   attr(,"package")
   [1] "sp"

   [[2]]
   [1] "SpatialPolygons"
   attr(,"package")
   [1] "sp"

   [[3]]
   [1] "SpatialPolygons"
   attr(,"package")
   [1] "sp"

plot(out[[3]]) # Hole preserved

如果需要一个Polygons列表,只需从SpatialPolygons对象中提取相应的槽口:
out <- lapply(1:n_poly, function(i) SpP[i, ]@polygons[[1]])

lapply(out, class)

> lapply(out, class)
[[1]]
[1] "Polygons"
attr(,"package")
[1] "sp"

[[2]]
[1] "Polygons"
attr(,"package")
[1] "sp"

[[3]]
[1] "Polygons"
attr(,"package")
[1] "sp"

2
如果你的 SpatialPolygons 对象被命名为 mysp ...
out <- lapply( mysp@polygons , slot , "Polygons" )

1
这将返回一个SpatialPolygons列表,而不是普通的Polygons(有些答案是这样的)。
SpP %>% split(1:length(.))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接