jat*_*bat 10 r spatial polygons
在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)
Run Code Online (Sandbox Code Playgroud)
然后跑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
Run Code Online (Sandbox Code Playgroud)
根据RGEOS
v0.3-2手册(http://cran.r-project.org/web/packages/rgeos/rgeos.pdf):
为了使rgeos正常工作,给定的POLYGON或MULTIPOLYGON几何体中的所有孔必须属于特定的多边形.SpatialPolygons类实现当前不包含此信息.要解决此限制,rgeos在Polygons类上使用另一个注释属性,该属性指示哪个孔属于哪个多边形.在当前实现下,此注释是由空格分隔的数字的文本字符串,其中数字的顺序对应于"多边形"对象的"多边形"槽中的"多边形"对象的顺序.0表示Polygon对象是多边形,非零数字表示Polygon对象是一个孔,其值指示"拥有"该孔的多边形的索引.
因此,createSPComment()
函数RGEOS
可能是重新聚合多边形和漏洞的一种解决方法.
Rob*_*ans 13
要将多面体对象分成单个多边形(如果存在,则为孔),您可以这样做
d <- disaggregate(p)
Run Code Online (Sandbox Code Playgroud)
当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)
Run Code Online (Sandbox Code Playgroud)
如果你的SpatialPolygons
对象被称为mysp
...
out <- lapply( mysp@polygons , slot , "Polygons" )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6823 次 |
最近记录: |