如何在R中使用线条将多边形分割/裁剪?

10
我想把 CO(一个多边形)分成几个没有被道路(线串)切割的区域(也是多边形)。也就是说,我希望小多边形的区域由道路或州边界组成,并且不包含任何进出多边形的道路。
我可以使用 lwgeom::st_split 生成一个几何图集,但我不确定它是否对我有帮助。我陷入了困境,因为我不知道如何从集合中提取几何图形,并为其分配唯一的 ID。
我的最终目标是确保我的点(单独的数据)不会被道路分开。如果您有更直接的解决方案,我非常愿意听取建议。
library(tidyverse)
library(tigris)
library(sf)
library(lwgeom)

co <- states(cb = T) %>% 
  filter(NAME == "Colorado")

roads <- primary_secondary_roads(state = 'Colorado') 

cosplit <- st_split(co,roads) 

有人找到或看到了这个问题的解决方法吗?
2个回答

7

我想我弄明白了...但我绝对愿意听听其他人的想法!!!

cosplitpoly <- cosplit %>% 
  st_collection_extract(c("POLYGON"))

2

从使用这个来解决我的问题的过程中,我注意到一个小细节。我发现 'LINESTRING' 无法将多边形分割,而 'MULTILINESTRING' 可以。

在我的测试案例中,当我首先通过相关的多边形分割 'LINESTRING' 时,结果也更加干净。

rb <- data.frame('lon' = c(10,10,20,20, 10), 
                 'lat' = c(5,10,10,5,5)) %>% 
  st_as_sf(coords = 1:2) %>% 
  st_set_crs(4326) %>% 
  concaveman()

sl <- data.frame('lon' = c(5,10,15,20,25), 
                 'lat' = c(7,7,7,7,7)) %>% 
  st_as_sf(coords = 1:2) %>% 
  st_set_crs(4326) %>% 
  st_union() %>% 
  st_cast('LINESTRING') %>% 
  st_sf()

ggplot() + 
  geom_sf(data = rb) + 
  geom_sf(data = sl)

sls <- sl %>% lwgeom::st_split(., rb) %>% st_collection_extract('LINESTRING')

slc <- sls %>% st_sample(size = round(sum(st_length(.)) / as_units(10000, 'm'),0) %>% as.numeric())

bool_inside <- st_within(slc, rb, sparse = F) %>% rowSums() > 0

nl <- sls[bool_inside,]

rbi <- rb %>% lwgeom::st_split(., sls %>% st_cast('MULTILINESTRING') %>% 
                                 st_union()) %>% st_collection_extract('POLYGON') %>% 
  mutate(id = row_number())

ggplot() + 
  geom_sf(data = rb) + 
  geom_sf(data = nl)

ggplot(rbi)+geom_sf(aes(fill = id))

使用哪个包中的函数"as_units"? - Lewkrr
"单位"包装。 - Bryce Miller
运行 st_coordinates(sl),你会注意到你的 "sl" 对象的点不再按照它们原来的顺序排列:X = 5,10,20,15,25,而不是原来的 5,10,15,20,25。在你的情况下,st_union() 是创建你的 "sls" 对象的错误步骤。相反,你应该使用 summarise() 将你的经度/纬度组合成几何图形,例如 sls <- data.frame('lon' = c(5,10,15,20,25), 'lat' = c(7,7,7,7,7)) %>% st_as_sf(coords = c('lon', 'lat'), crs = 4326) %>% summarise(geometry = st_combine(geometry)) %>% st_cast("LINESTRING") %>% st_split(., rb) %>% st_collection_extract("LINESTRING") - undefined
另外,你可以使用summarise(geometry = st_combine(geometry))代替concaveman()来创建多边形对象,而且你也不需要第五个节点,例如rb <- data.frame('lon' = c(10,10,20,20), 'lat' = c(5,10,10,5)) %>% st_as_sf(coords = c('lon', 'lat'), crs = 4326) %>% summarise(geometry = st_combine(geometry)) %>% st_cast("POLYGON") - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接