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

Complex clipping (spatial intersection ?) of polygons and lines in R

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

这里有一些制作多边形的代码和示例:

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)

您可以为此使用 spatstat 包。原始示例下方是 通过。在 spatstat 中,多边形被用作“观察 windows” 点模式,所以它们是 class owin。可以做 set 与 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)