仅保留sf data.frame中的二维组件

时间:2017-11-07 18:17:26

标签: r gis sf

我有与this question类似的设置。但是,在我的情况下,我有一个sf data.frame,其中包含不同几何类型的混合,一些POLYGON s,一些GEOMETRYCOLLECTION如下:

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)

a1 <- st_sf(a=1, geom = st_sfc(i))
a2 <- st_sf(a=2, geom = st_sfc(a))

ii <- rbind(a1, a2)

正如上面提到的问题,我想要的只是保留GEOMETRYCOLLECTION中那些二维的部分,因为我最终对这些几何的区域感兴趣st_area()不适用GEOMETRYCOLLECTION s。

然而,在混合几何的情况下,答案是

st_cast(ii)[which(st_is(st_cast(ii), c("POLYGON", "MULTIPOLYGON"))),]

不起作用,因为st_cast()使GEOMETRYCOLLECTION保持不变。

2 个答案:

答案 0 :(得分:2)

你试过吗

st_collection_extract(ii)

?你是什​​么意思st_area没有在收藏品上工作?我明白了

 > st_area(ii)
[1] 0.625 7.500

答案 1 :(得分:0)

我不确定这是最优雅的解决方案,但它有效:

split(ii, 1:nrow(ii)) %>% 
  purrr::map(~ st_cast(.x) %>% 
                 filter(st_dimension(.) == 2)) %>% 
  do.call(rbind, .)