如何在图形上用直线分割多边形?

时间:2019-10-27 13:17:04

标签: r polygon

我一直为此苦苦挣扎。我在这里找到了一些类似的问题,但是所有这些问题似乎都对这个特定问题有些大材小用。我有两个要互相减去的部分重叠的多边形(从sel_pol中减去base_pol)。之后,所得的多边形(diff)将沿着垂直直线x=20进一步分割。这就是我卡住的地方。

首先,我使用了sf软件包。这帮助我将两个多边形彼此相减并检索得到的diff多边形的顶点。但是,我找不到在x=20包中的sf处分割所得多边形的任何功能,因此我转向了另一个包lwgeom

但是,不幸的是,我这里有两个主要问题。首先,st_split函数以一种奇怪的格式返回顶点:GEOMETRYCOLLECTION (POLYGON ((5 0.55, 5 0.6, 19 0.6, 23 0.5, 20.5 0.5, 17 0.55, 5 0.55))),但我不确定如何使用它以与使用{ {1}},其次,得到的顶点是错误的。它没有切割sf多边形。

很明显,我在这里做错了。我也不喜欢这样的基本操作,我必须使用两个单独的库。如果有人可以给我提示如何使该过程更整洁,我将不胜感激。

我的可复制示例如下:

diff

这是一个视觉表示。紫色区域就是我在代码中称为library(ggplot2) library(sf) library(lwgeom) rm(list = ls()) group_prc <- data.frame(x = c(5, 23, 19, 5), y = c(0.5, 0.5, 0.6, 0.6), group = "prc") group_exp <- data.frame(x = c(5, 24, 17, 5), y = c(0.45, 0.45, 0.55, 0.55), group = "exp") base_pol<- Polygons(list(Polygon(group_prc[, c("x", "y")])), "base") sel_pol <- Polygons(list(Polygon(group_exp[, c("x", "y")])), "sel") shape <- SpatialPolygons(list(base_pol, sel_pol)) diff <- shape["base"]-shape["sel"] diffVert <- diff@polygons[[1]]@Polygons[[1]]@coords diffVert dat <- rbind(group_prc, group_exp, data.frame(diffVert, group = "diff")) dat ggplot(dat, aes(x = x, y = y, fill = group)) + geom_polygon(alpha = 0.5) + geom_vline(xintercept = 20) splitRes <- st_split(st_polygon(list(diff@polygons[[1]]@Polygons[[1]]@coords)), st_linestring(rbind(c(20,20), c(0, 1)))) splitRes 的地方,我想获得diff多边形x=20左侧的所有物体的顶点(最终是该区域)

enter image description here

1 个答案:

答案 0 :(得分:0)

我设法解决了一个难题。不再需要lwgeom软件包。基本上,我将足够长的矩形定义为data.frame并将其转换为兼容sf的{​​{1}}对象。

然后,有了三个SpatialPolygon对象,我现在可以将它们彼此相减,就像我之前获得SpatialPolygon时一样。我从下面的代码中删除了diff,因为无论如何这只是一个临时解决方案。

diff

输出是此数据帧:

library(sf)
library(rgeos)

group_prc <- data.frame(x = c(5, 23, 19, 5), y = c(0.5, 0.5, 0.6, 0.6), group = "prc")
group_exp <- data.frame(x = c(5, 24, 17, 5), y = c(0.45, 0.45, 0.55, 0.55), group = "exp")
group_lim <- data.frame(x = c(20, 20, 500, 500), y = c(0, 1, 1, 0), group = "lim")
prc_pol <- Polygons(list(Polygon(group_prc[, c("x", "y")])), "prc")
exp_pol <- Polygons(list(Polygon(group_exp[, c("x", "y")])), "exp")
lim_pol <- Polygons(list(Polygon(group_prcmax[, c("x", "y")])), "lim")
shape <- SpatialPolygons(list(prc_pol, exp_pol, lim_pol))

out_pol <-  shape["prc"]-shape["exp"]-shape["lim"]

out_pol@polygons[[1]]@Polygons[[1]]@coords