【问题标题】:Split polygon parts of a single SpatialPolygons Object拆分单个 SpatialPolygons 对象的多边形部分
【发布时间】:2013-10-19 09:32:31
【问题描述】:

在 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 对象是使用gUnaryUnion 函数(在RGEOS 包中)完成的几何联合的结果。如果我申请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 正常工作,所有孔都必须 在给定的 POLYGON 或 MULTIPOLYGON 几何体中必须属于 特定的多边形。 SpatialPolygons 类实现不 目前包括此信息。解决此限制 rgeos 在 Polygons 类上使用了一个额外的注释属性 指示哪个孔属于哪个多边形。在当前 实现这个注释是一个由数字分隔的文本字符串 数字的顺序与数字的顺序相对应的空间 Polygons 对象的 Polygons 槽中的多边形对象。一个 0 表示 Polygon 对象是多边形,非零数表示 Polygon 对象是一个洞,其值指示索引 “拥有”洞的多边形。

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

【问题讨论】:

    标签: r spatial polygons


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

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

      out <- lapply( mysp@polygons , slot , "Polygons" )
      

      【讨论】:

        【解决方案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"
        

        【讨论】:

          【解决方案4】:

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

          SpP %>% split(1:length(.))
          

          【讨论】:

            猜你喜欢
            • 2013-04-18
            • 2019-04-23
            • 1970-01-01
            • 2020-02-08
            • 2020-05-19
            • 1970-01-01
            • 1970-01-01
            • 2018-08-05
            • 1970-01-01
            相关资源
            最近更新 更多