查找R中非重叠多边形的所有排列(sp或sf对象)

时间:2018-10-28 15:36:51

标签: r sp sf

我有一个空间对象(例如Multipolygon中的sfSpatialPolygons中的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)

enter image description here

我正在执行一个例程,该例程将创建以下三个对象,其图形如下:

a。 a

b。 enter image description here

c。 enter image description here

理想地,该例程还将允许多边形相交的阈值。

我认为,即使对于中等大小的对象(例如150个多边形,会产生很多可能的组合),我自己写的任何例程都将花费极高的时间。我希望有人已经解决了这个问题。

1 个答案:

答案 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