微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决R 中多边形和线的复杂裁剪空间交集?

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

enter image description here

以下是一些代码,用于制作多边形以实现可重复性和示例:

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.14,-0.84,-0.24,-0.44,0.12))

p2 <- data.frame(x = c(-0.63,-0.2,-0.38,-0.26,-0.82,-0.57,y = c(-0.1,0.15,-0.17,-0.79,-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.47))

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

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

lines(l1$x,l1$y)

解决方法

您可以为此使用 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.14,-0.84,-0.24,-0.44,0.12))

p2 <- data.frame(x = c(-0.63,-0.2,-0.38,-0.26,-0.82,-0.57,y = c(-0.1,0.15,-0.17,-0.79,-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.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,add = TRUE)
plot(L1clip,add = TRUE)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。