我一直为此苦苦挣扎。我在这里找到了一些类似的问题,但是所有这些问题似乎都对这个特定问题有些大材小用。我有两个要互相减去的部分重叠的多边形(从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
左侧的所有物体的顶点(最终是该区域)
答案 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