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