使用linestring剪裁多边形

使用linestring剪裁多边形,r,sf,R,Sf,我正在尝试找出如何基于线串剪裁多边形。我估计了陆生动物的活动范围,这个范围估计延伸到了海洋。我想剪掉伸入海洋的任何部分 我使用rnaturalearth获取海岸线,它返回一系列的线字符串 library(lwgeom) library(rnaturalearth) library(rnaturalearthhires) library(sf) cl10 <- ne_coastline(scale=10,returnclass='sf') 我认为st_相交不起作用,因为它返回与poly1

我正在尝试找出如何基于线串剪裁多边形。我估计了陆生动物的活动范围,这个范围估计延伸到了海洋。我想剪掉伸入海洋的任何部分

我使用rnaturalearth获取海岸线,它返回一系列的线字符串

library(lwgeom)
library(rnaturalearth)
library(rnaturalearthhires)
library(sf)

cl10 <- ne_coastline(scale=10,returnclass='sf')
我认为st_相交不起作用,因为它返回与poly1相交的多行字符串

我想要的是一个多边形,它的水顶区域被剪掉了。如下所示,st_交叉口返回的几何图形为蓝色

intr <- st_intersection(poly1,sa_coast)

ggplot() +
  geom_sf(data=poly1,fill=NA,color='red') +
  geom_sf(data=sa_coast) + #,mapping=aes(color=rowid)
  geom_sf(data=intr,color='blue') +
  xlim(st_bbox(polys)['xmin'],st_bbox(polys)['xmax']) +
  ylim(st_bbox(polys)['ymin'],st_bbox(polys)['ymax']) +
  theme_classic()

要剪裁线串和多边形,请使用sf::st_交点

考虑RStudio社区站点上的示例,我使用它来确定一些随机的北卡罗来纳州(一个流行的数据集县)的多边形与第36平行线的交点

编辑:线串和多边形的交点将是线串


如果期望输出是多边形,考虑调用Sf::STY多边形。它将把它变成一个多边形,在与另一个多边形相交时返回一个多边形。

这是我最终找到的解决方案。感谢@JindaLacko,他给了我在线串上使用st_polygonize的想法。然而,我的linestring没有关闭,因此st_polygonize无法工作。技巧是使用多边形的边界框剪裁线串,然后使用边界框的最小角点作为线串上的点,然后使用线串的第一个点闭合线串。然后可以将其转化为多边形

将海岸线剪裁为多边形边界框的大小

sa_clip <- st_intersection(st_as_sfc(st_bbox(poly1)),sa_coast)
ggplot() +
  geom_sf(data=st_as_sfc(st_bbox(poly1)),fill=NA) +
  geom_sf(data=sa_clip) +
  theme_classic()
clipped <- st_intersection(sa_poly,poly1)

ggplot() +
  geom_sf(data=sa_poly,fill='red',alpha=.2) +
  geom_sf(data=poly1,fill='blue',alpha=.2) +
  geom_sf(data=clipped,fill='purple',alpha=.2) +
  theme_classic()
获取边界框的最小角点

corner <- st_bbox(poly1)[c('xmin','ymin')] %>% st_point %>% st_sfc(crs=4326)
将线串投射到点,附加角点,闭合线串,变成多边形

pts <- sa_clip %>% st_geometry %>% st_cast("POINT")
sa_poly <- c(pts,corner,pts[1]) %>% st_combine %>% st_cast('LINESTRING') %>% st_polygonize
现在,可以剪裁多边形了

sa_clip <- st_intersection(st_as_sfc(st_bbox(poly1)),sa_coast)
ggplot() +
  geom_sf(data=st_as_sfc(st_bbox(poly1)),fill=NA) +
  geom_sf(data=sa_clip) +
  theme_classic()
clipped <- st_intersection(sa_poly,poly1)

ggplot() +
  geom_sf(data=sa_poly,fill='red',alpha=.2) +
  geom_sf(data=poly1,fill='blue',alpha=.2) +
  geom_sf(data=clipped,fill='purple',alpha=.2) +
  theme_classic()

你们也能提供poly1吗?我已经为poly1添加了wkt。注意:您必须在wkt的末尾添加一个“”,因为它由于某种原因没有显示。您好,谢谢您的回复。这似乎不起作用,因为st_intersection返回与多边形相交的多重线。我想要的是一个基于线字符串剪裁的多多边形。我已经更新了这个问题,使之更清楚。你有其他的建议吗?@ BenCarlson然后考虑把你的线串变成一个多边形-如我的答案的更新版本所描述的。谢谢@ JindraLacko,你的建议使用STY多边形化帮助我找到解决方案。我已经发布了完整的解决方案,但选择了您的答案作为接受答案。@BenCarlson很高兴它成功了!&谢谢你的客气话
clipped <- st_intersection(sa_poly,poly1)

ggplot() +
  geom_sf(data=sa_poly,fill='red',alpha=.2) +
  geom_sf(data=poly1,fill='blue',alpha=.2) +
  geom_sf(data=clipped,fill='purple',alpha=.2) +
  theme_classic()