在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
个对象的唯一列表(n.b。不是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正常运行,必须有所有的洞 在给定的POLYGON或MULTIPOLYGON几何内必须属于a 特定多边形。 SpatialPolygons类实现没有 目前包含此信息。解决这个限制 rgeos在Polygons类上使用了另一个注释属性 表示哪个孔属于哪个多边形。根据目前 实现此注释是由数字分隔的文本字符串 数字顺序对应于数字顺序的空格 “多边形”对象的“多边形”槽中的多边形对象。一个0 暗示Polygon对象是一个多边形,一个非零数字暗示 Polygon对象是一个值,表示索引的值 “拥有”这个洞的多边形。
因此createSPComment()
中的RGEOS
函数可能是重新聚合多边形和漏洞的解决方法。
答案 0 :(得分:12)
要将多面体对象分离为单个多边形(如果存在,则为孔),您可以执行
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)
答案 1 :(得分:2)
如果您的SpatialPolygons
对象被调用mysp
...
out <- lapply( mysp@polygons , slot , "Polygons" )
答案 2 :(得分:2)
据我了解,OP希望将SpatialPolygons
对象转换为Polygons
列表,如果存在则保留漏洞。
OP创建的SpP
对象包含三个多边形,其中第三个具有关联的洞。
您可以使用lapply
在SpP
中循环浏览每个多边形,并返回SpatialPolygons
列表。 Polygons
和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"
答案 3 :(得分:1)
这将返回一个SpatialPolygons列表而不是普通多边形(其中一些答案可以做到)。
SpP %>% split(1:length(.))