【问题标题】:How to select certain geometries from a geometrycollection after st_intersect?如何在 st_intersect 之后从几何集合中选择某些几何?
【发布时间】:2018-01-25 04:47:40
【问题描述】:

我正在使用奇妙的新 sf 包运行两个多边形或其他 sf 对象的相交。类似这样:

a <- st_polygon(list(cbind(c(0,0,7.5,7.5,0),c(0,-1,-1,0,0))))
b <- st_polygon(list(cbind(c(0,1,2,3,4,5,6,7,7,0),c(1,0,.5,0,0,0.5,-0.5,-0.5,1,1))))
i <- st_intersection(a,b)
## GEOMETRYCOLLECTION(POINT(1 0), LINESTRING(4 0, 3 0), POLYGON((5.5 0, 7 0, 7 -0.5, 6 -0.5, 5.5 0)))

我如何只保留GEOMETRYCOLLECTIONPOLYGON?在功能集合中选择不同的类型很容易,但我似乎无法在 sf 包中找到与 ST_CollectionExtract 等效的内容。

【问题讨论】:

    标签: r spatial sf


    【解决方案1】:

    输出是一个列表,您可以在此处使用i[[3]] 提取。
    如果您以更标准的方式查找哪个元素是多边形,请使用:

    w.pol <- purrr::map_lgl(i, ~st_is(.x, c("POLYGON", "MULTIPOLYGON")))
    pol <- i[[which(w.pol)]]
    
    ##> pol
    ## POLYGON((5.5 0, 7 0, 7 -0.5, 6 -0.5, 5.5 0))
    

    编辑:如果你有sfc,你可以使用st_cast来分隔特征类型,然后选择感兴趣的线:

    # Simple feature data frame of spatial collection
    a1 <- st_sf(a=1, geom = st_sfc(i))
    a2 <- st_sf(a=2, geom = st_sfc(i))
    
    ii <- rbind(a1, a2)
    
    # Use st_cast to separate all features types
    st_cast(ii)[which(st_is(st_cast(ii), c("POLYGON", "MULTIPOLYGON"))),]
    

    编辑:2017-12-23

    你可以直接使用:

    st_collection_extract(i, "POLYGON") 
    

    【讨论】:

    • 谢谢,这在这种情况下效果很好! @StatnMap,当几何集合是简单特征数据框的一部分而不仅仅是单个对象时,你会怎么做?这只会删除所有集合,但它们内部可能有多边形。
    • 如果简单特征数据框不仅包含GEOMETRYCOLLECTIONs 还包含其他几何图形,例如如果我在上面将a2 &lt;- st_sf(a=2, geom = st_sfc(i)) 更改为a2 &lt;- st_sf(a=2, geom = st_sfc(a))
    猜你喜欢
    • 2017-01-05
    • 2020-10-03
    • 2018-08-14
    • 1970-01-01
    • 2013-05-24
    • 2014-08-20
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多