在R语言中检查多边形是否相交

3
许多用户询问如何检查多边形是否相交,但是目前这些问题的答案对我的情况不起作用。
我有两个对象。一个是名为“farms”的“大型SpatialPolygons”,该对象具有几个多边形(总共2011个),每个多边形指示不同农场的限制(请参见打印屏幕)。
我的第二个对象是名为slope_RJ_100m的“大型SpatialPolygons DataFrame”。该对象将一个大区域分成几个面积为10.000平方米的正方形多边形(总共310000个多边形)。
对于“slope_RJ_100m”中的每个正方形(多边形),我想知道它们是否与“farms”中的任何多边形相交。换句话说,我想知道“slope_RJ_100m”中的每个特定正方形是否内部有农场(即使只有一小部分农场)。 我预计结果应该是310000行和两个变量,一个表示slope_RJ_100m中的多边形,另一个变量为TRUE或FALSE,表示该多边形是否有农场。
我尝试过:
inters = gIntersection(slope_RJ_100m, farms)

这个程序会产生大约1500个多边形的输出。

我不确定如何使用它来知道我的310000个多边形中哪些包含了农场。

inters = raster::intersect(slope_RJ_100m, farms)

输出结果有29144个多边形。与以前的情况一样,我不确定如何使用它来知道一个正方形是否有农场。

还有

inters = st_intersects(slope_RJ_100m, farms)

错误:UseMethod("st_intersects"): 对类为 "c('SpatialPolygonsDataFrame', 'SpatialPolygons', 'Spatial', 'SpatialPolygonsNULL', 'SpatialVector', 'SPNULL')" 的对象应用 'st_intersects' 没有适用的方法。

我确定我的问题很简单,提前向您道歉。

enter image description here

1个回答

4

这里有一个关于terra的例子(要运行此示例,您需要使用 terra 1.1-17)

library(terra)
# polygons
p1 <- vect("POLYGON ((0 0, 8 0, 8 9, 0 9, 0 0))")
p2 <- vect("POLYGON ((5 6, 15 6, 15 15, 5 15, 5 6))")
p3 <- vect("POLYGON ((8 2, 9 2, 9 3, 8 3, 8 2))")
p4 <- vect("POLYGON ((2 6, 3 6, 3 8, 2 8, 2 6))")
p5 <- vect("POLYGON ((2 12, 3 12, 3 13, 2 13, 2 12))")
p6 <- vect("POLYGON ((10 4, 12 4, 12 7, 11 7, 11 6, 10 6, 10 4))")

p <- rbind(p1, p2, p3, p4, p5, p6)
plot(p, col=rainbow(6, alpha=.5))
lines(p, lwd=2)
text(p)

enter image description here

relate(rbind(p1, p2), rbind(p3,p4,p5,p6), "intersects")
#      [,1]  [,2]  [,3]  [,4]
#[1,]  TRUE  TRUE FALSE FALSE
#[2,] FALSE FALSE FALSE  TRUE
 

有了你的 SpatialPolygons*,你应该能够做到以下几点:

s <- vect(slope_RJ_100m)
f <- vect(farms)
x <- relate(s, f, "intersects")

同样地,使用 st_intersects 需要使用 sf 对象,而非 Spatial* 对象。可以尝试如下方式:
library(sf)
ss <- st_as_sf(slope_RJ_100m)
ff <- st_as_sf(farms)
inters <- st_intersects(ss, ff)

使用上述示例数据

s1 < st_as_sf(rbind(p1, p2))
s2 <- st_as_sf(rbind(p3,p4,p5,p6))
st_intersects(s1, s2)
#Sparse geometry binary predicate list of length 2, where the predicate was `intersects'
# 1: 1, 2
# 2: 4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接