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(即Srs1, Srs2, Srs3)。

然而,我试图解决的案例与这个例子有点不同。SpatialPolygons我要拆分的对象是使用gUnaryUnion函数(在RGEOS包中)完成的几何联合的结果。如果我申请out <- lapply(merged.polygons@polygons, slot, "Polygons"),我会得到一个唯一的Polygon对象列表(nb 不是Polygons对象列表)。换句话说,每个多边形都与其孔分开。

跑步 topol <- sapply(unlist(out), function(x) x@hole)

我得到:

> length(topol)
[1] 4996


> sum(topol, na.rm=TRUE)
[1] 469

根据RGEOSv0.3-2 手册(http://cran.r-project.org/web/packages/rgeos/rgeos.pdf):

为了使 rgeos 正常工作,给定 POLYGON 或 MULTIPOLYGON 几何图形中的所有孔必须属于特定多边形。SpatialPolygons 类实现当前不包含此信息。为了解决这个限制,rgeos 在 Polygons 类上使用了一个额外的注释属性,该属性指示哪个孔属于哪个多边形。在当前实现下,此注释是由空格分隔的数字文本字符串,其中数字的顺序对应于 Polygons 对象的 Polygons 槽中的 Polygon 对象的顺序。0 表示 Polygon 对象是一个多边形,非零数字表示 Polygon 对象是一个孔,其值指示“拥有”该孔的 Polygon 的索引。

所以中的createSPComment()函数RGEOS很可能是重新聚合多边形和孔的一种解决方法。

4

4 回答 4

15

要将多面体对象分成单个多边形(如果存在孔),您可以这样做

d <- disaggregate(p)

p对象在哪里SpatialPolygons。之后,您可以使用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)
于 2015-09-29T04:03:03.270 回答
3

据我了解,OP 想要将一个SpatialPolygons对象转换为一个 列表Polygons,如果存在则保留孔。

OP 创建的SpP对象包含三个多边形,其中第三个有一个关联的孔。

您可以使用lapply循环遍历 中的每个多边形SpP,返回SpatialPolygons. Polygonsa和object的区别在于SpatialPolygons添加了绘图顺序信息。但是,由于每个结果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"
于 2015-09-28T11:57:54.823 回答
2

如果您的SpatialPolygons对象被称为mysp...

out <- lapply( mysp@polygons , slot , "Polygons" )
于 2013-10-11T10:56:27.413 回答
1

这将返回一个 SpatialPolygons 列表,而不是普通的 Polygons (某些答案会这样做)。

SpP %>% split(1:length(.))
于 2017-09-22T16:18:55.593 回答