繁体   English   中英

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

[英]find all permutations of non-overlapping polygons in R (sp or sf objects)

我有一个空间对象(例如sfMultipolygonspSpatialPolygons ),并且我想找到非重叠SpatialPolygons所有可能排列。 这里有一些图表说明了我的追求。 假设我有以下多边形。

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)

在此处输入图片说明

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

一种。 一种

在此处输入图片说明

C。 在此处输入图片说明

理想地,该例程还将允许在多边形相交处具有阈值。

我认为,即使对于中等大小的对象(例如150个多边形,也会产生许多可能的组合),无论我写什么例程,都要花很长时间。 我希望有人已经解决了这个问题。

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遵循输入参数min和max给出的大小限制,在输入图中找到所有完整的子图。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM