2017-11-07 16 views
0

this question과 비슷한 설정이 있습니다. 내 경우에는, 그러나, 나는 다른 지오메트리 유형의 혼합, 일부 POLYGON의, 그래서 같은 일부 GEOMETRYCOLLECTION의 포함 된 sf data.frame있어 : 위에서 언급 한 문제로sf data.frame에서 2 차원 구성 요소 만 유지하십시오.

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) 

를, 내가 원하는 것은 2 차원 인 GEOMETRYCOLLECTION의 일부만 유지하는 것입니다. 궁극적으로 저는이 도형의 영역에 관심이 있으며 st_area()GEOMETRYCOLLECTION에서 작동하지 않습니다. 혼합 된 형상의 경우

은, 그러나, 대답은 st_cast()은 건드리지 GEOMETRYCOLLECTION 잎대로 작동하지 않습니다
st_cast(ii)[which(st_is(st_cast(ii), c("POLYGON", "MULTIPOLYGON"))),] 

을 부여.

답변

2

당신은

st_collection_extract(ii) 

을 시도 했습니까? st_area이 컬렉션에서 작동하지 않는다는 것은 무엇을 의미합니까? 내가 본다

> st_area(ii) 
[1] 0.625 7.500 
+0

'st_collection_extract()'가 0.5.5에서 새 것이냐? 그렇다면 내 문제 일 수도 있습니다. – RoyalTS

+0

예, 0.5-5의 새로운 기능입니다. –

0

I이 가장 우아한 해결책 확실하지 않다 그러나 그것은 작동합니다

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