2017-11-07 3 views
0

Ich habe eine ähnliche Einrichtung wie in this question. In meinem Fall habe ich aber bekam eine sf data.frame, die eine Mischung aus verschiedenen Geometrietypen enthält, einige POLYGON s, einige GEOMETRYCOLLECTION s etwa so:Behalten Sie nur zweidimensionale Komponenten in sf data.frame

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) 

Wie in der Frage oben Bezug genommen wurde, was ich möchte nur die Teile der GEOMETRYCOLLECTION beibehalten, die zweidimensional sind, da ich mich letztendlich für die Bereiche dieser Geometrien interessiere und st_area() nicht auf GEOMETRYCOLLECTION s funktionieren wird.

Im Fall von gemischten Geometrien, die Antwort jedoch

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

funktioniert nicht wie die st_cast() verlässt die unberührte GEOMETRYCOLLECTION gegeben.

Antwort

2

Haben Sie versucht,

st_collection_extract(ii) 

? Und was meintest du mit st_area funktioniert nicht auf Sammlungen? Ich sehe

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

Ist 'st_collection_extract()' neu in 0.5.5? Wenn das so war, war das mein Problem. – RoyalTS

+0

ja, es ist neu in 0.5-5 –

0

Ich bin mir nicht sicher, dass dies die eleganteste Lösung, aber es funktioniert:

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