R中多边形和线的复杂裁剪(空间交点?)

Posted

技术标签:

【中文标题】R中多边形和线的复杂裁剪(空间交点?)【英文标题】:Complex clipping (spatial intersection ?) of polygons and lines in R 【发布时间】:2021-02-12 08:30:36 【问题描述】:

我想使用多边形而不是矩形来剪辑(或者正确的公式是执行空间相交)多边形和线,如下所示:

以下是一些用于制作多边形的代码和示例:

p1 <- data.frame(x = c(-0.81, -0.45, -0.04, 0.32, 0.47, 0.86, 0.08, -0.46, -1, -0.76), 
                 y = c(0.46, 1, 0.64, 0.99, -0.04, -0.14, -0.84, -0.24, -0.44, 0.12))

p2 <- data.frame(x = c(-0.63, -0.45, -0.2, -0.38, -0.26, -0.82, -0.57, -0.76), 
                 y = c(-0.1, 0.15, -0.17, -0.79, -1, -0.97, -0.7, -0.61))

l1 <- data.frame(x = c(0.1, 0.28, 0.29, 0.52, 0.51, 0.9, 1), 
                 y = c(0.19, -0.15, 0.25, 0.28, 0.64, 0.9, 0.47))

plot.new()
plot.window(xlim = c(-1, 1), ylim = c(-1,1))

polygon(p2$x, p2$y, col = "blue")
polygon(p1$x, p1$y)

lines(l1$x, l1$y)

【问题讨论】:

【参考方案1】:

您可以为此使用spatstat 包。下面的原始示例是 工作通过。在spatstat 中,多边形被用作“观察窗” 点模式,因此它们属于owin 类。可以设置 与owin 对象的交集、联合等。

p1 <- data.frame(x = c(-0.81, -0.45, -0.04, 0.32, 0.47, 0.86, 0.08, -0.46, -1, -0.76), 
                 y = c(0.46, 1, 0.64, 0.99, -0.04, -0.14, -0.84, -0.24, -0.44, 0.12))

p2 <- data.frame(x = c(-0.63, -0.45, -0.2, -0.38, -0.26, -0.82, -0.57, -0.76), 
                 y = c(-0.1, 0.15, -0.17, -0.79, -1, -0.97, -0.7, -0.61))

l1 <- data.frame(x = c(0.1, 0.28, 0.29, 0.52, 0.51, 0.9, 1), 
                 y = c(0.19, -0.15, 0.25, 0.28, 0.64, 0.9, 0.47))

在 spatstat 中,多边形必须逆时针遍历,所以:

library(spatstat)
p1rev <- lapply(p1, rev)
p2rev <- lapply(p2, rev)

W1 <- owin(poly = p1rev)
W2 <- owin(poly = p2rev)
L1 <- psp(x0 = l1$x[-nrow(l1)], y0 = l1$y[-nrow(l1)],
          x1 = l1$x[-1], y1 = l1$y[-1], window = boundingbox(l1))

plot(boundingbox(W1,W2,L1), type= "n", main = "Original")
plot(W2, col = "blue", add = TRUE)
plot(W1, add = TRUE)
plot(L1, add = TRUE)

W2clip <- W2[W1]
L1clip <- L1[W1]

plot(W1, main = "Clipped")
plot(W2clip, col = "blue", add = TRUE)
plot(L1clip, add = TRUE)

【讨论】:

以上是关于R中多边形和线的复杂裁剪(空间交点?)的主要内容,如果未能解决你的问题,请参考以下文章

计算两条边的交点

判断一个点是否在一个复杂多边形的内部

二维空间计算几何

判断一条线与四边形的交点

多边形相交的简单算法

将栅格裁剪为 sf 集合中的多边形 [R sf]