我有一个空间对象(例如Multipolygon
中的sf
或SpatialPolygons
中的sp
),我想找到所有不重叠特征的可能排列。这里有一些图表说明了我的追求。假设我有以下多边形。
library(sf)
# points
a <- st_as_sf(data.frame(lon = c(1,2,3.5,3,6), lat = c(0,1,0,1.5,-3)), coords = c('lon', 'lat'))
# circles
b <- st_buffer(a, 1)
# colors
cols = c('grey', 'red', 'green', 'yellow', 'blue')
cols = adjustcolor(cols, alpha.f = .5)
# plot
plot(b, col = cols)
我正在执行一个例程,该例程将创建以下三个对象,其图形如下:
理想地,该例程还将允许多边形相交的阈值。
我认为,即使对于中等大小的对象(例如150个多边形,会产生很多可能的组合),我自己写的任何例程都将花费极高的时间。我希望有人已经解决了这个问题。
答案 0 :(得分:2)
M <- st_overlaps(b, sparse = FALSE) * 1
(M <- 1 - M)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 0 1 1 1
# [2,] 0 1 0 0 1
# [3,] 1 0 1 0 1
# [4,] 1 0 0 1 1
# [5,] 1 1 1 1 1
colnames(M) <- c('grey', 'red', 'green', 'yellow', 'blue')
library(igraph)
A <- graph_from_adjacency_matrix(M)
max_cliques(A)
# [[1]]
# + 2/5 vertices, named, from dae1f9f:
# [1] red blue
#
# [[2]]
# + 3/5 vertices, named, from dae1f9f:
# [1] grey blue yellow
#
# [[3]]
# + 3/5 vertices, named, from dae1f9f:
# [1] grey blue green
cliques(A)
# ...
# Omitted, 13 cliques in total
首先,我们使用st_overlaps
得到一种邻接矩阵M
,其中两个多边形在您的数据中重叠时,在该图中是相邻的。但是实际上我们将需要1 - M
,其中两个多边形在不重叠的情况下在此新图中相邻。这很有用,因为您要查找的内容随后对应于此图中的(最大)集团:
cliques
在输入图中找到所有完整的子图,并遵守 最小和最大参数中给出的大小限制。
max_cliques
查找输入图中的所有最大派系。一个集团 如果不能扩展到更大的集团,则为最大。最大的 集团永远是最大的,但不一定是最大集团 最大。
在这种情况下,集团是一组多边形,其中没有一个多边形与其他多边形重叠。
此外,要将其应用于sp
对象,只需计算一个对应的M
。我相信over
会有所帮助。
奖金
要增加阈值的可能性,我们只需要重新计算M
。
aux <- function(x) if (length(x) == 1) x else 0
M <- matrix(1, nrow(a), nrow(a))
for(i in 1:nrow(a))
for(j in 1:nrow(a))
M[i, j] <- aux(st_area(st_intersection(b[i, 1], b[j, 1])))
diag(M) <- 0
然后,例如,如果我们仅在相交面积大于0.2的情况下将两个多边形视为相交,则运行
M <- 1 * (M > 0.2) # Getting threshold-overlaps
M <- 1 - M # The needed adjacency matrix