检查多边形是否在 R 中相交
Check if polygons intersect in R
许多用户询问如何检查多边形是否相交,但是,这些问题的当前答案不适用于我的情况。
我有两个对象。一个是名为“农场”的“大型空间多边形”。这个对象有几个多边形(2011 年的总数),每个多边形表示不同农场的限制(见打印屏幕)。
我的第二个对象是名为 slope_RJ_100m 的“Large SpatialPolygons DataFrame”。该对象将大面积划分为几个正方形多边形,每个正方形面积为 10.000m^2(总共 310000 个多边形)。
对于“slope_RJ_100m”中的每个正方形(多边形),我想知道它们是否与“农场”中的任何 多边形相交。换句话说,我想知道“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") 错误:
没有适用于 'st_intersects' 的方法应用于 class 的对象 "c('SpatialPolygonsDataFrame', 'SpatialPolygons', 'Spatial', 'SpatialPolygonsNULL', 'SpatialVector', 'SPNULL')"
我确定我的问题是微不足道的,我事先道歉。
这里有一个 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)
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
许多用户询问如何检查多边形是否相交,但是,这些问题的当前答案不适用于我的情况。
我有两个对象。一个是名为“农场”的“大型空间多边形”。这个对象有几个多边形(2011 年的总数),每个多边形表示不同农场的限制(见打印屏幕)。
我的第二个对象是名为 slope_RJ_100m 的“Large SpatialPolygons DataFrame”。该对象将大面积划分为几个正方形多边形,每个正方形面积为 10.000m^2(总共 310000 个多边形)。
对于“slope_RJ_100m”中的每个正方形(多边形),我想知道它们是否与“农场”中的任何 多边形相交。换句话说,我想知道“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") 错误: 没有适用于 'st_intersects' 的方法应用于 class 的对象 "c('SpatialPolygonsDataFrame', 'SpatialPolygons', 'Spatial', 'SpatialPolygonsNULL', 'SpatialVector', 'SPNULL')"
我确定我的问题是微不足道的,我事先道歉。
这里有一个 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)
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