在每个多边形内分别创建voronoi单元

时间:2020-10-27 15:03:24

标签: r sf voronoi

数据: 在下面的数据中,我有聚类,它们是数据的2个大类。每个群集中有5个区。我使用每个群集中的点为群集创建一个多边形。

问题:我正在尝试为每个集群中的每个区域计算voronoi。因此,这两个群集多边形中的每个都应具有5个voronoi单元。 如何创建由每个簇多边形限制的5个voronoi细胞?

.as-console-wrapper { max-height: 100% !important; top: 0; }

enter image description here

如果您查看图片,您会发现我做错了,因为当数据中只有5个区域时,西北面有6个voronoi单元。我认为问题在于我的脚本只是创建一个大的voronoi镶嵌,然后在其顶部放置多边形形状,而不是分别计算每个群集的voronoi,然后将它们限制在每个群集多边形内。

1 个答案:

答案 0 :(得分:1)

要为每个“集群”获得单独的voronoi多边形,可以运行for循环。代替表达式v <- st_voronoi(st_union(sf_district), sfbox),如下:

sf_district = st_join(sf_district, shapes)
result = list()
for(i in unique(sf_district$cluster)) {
    u = sf_district[sf_district$cluster == i, ]
    v = st_voronoi(st_union(u), sfbox)
    v = st_intersection(st_cast(v), shapes[shapes$cluster == i, ])
    result[[i]] = v
}
result = do.call(c, result)

这可以确保每个群集中的voronoi多边形不受其他点的影响,并且确保每个群集中的多边形数量与点数一样。

以下是结果图:

plot(result, col = hcl.colors(length(result), "Set 2"))
plot(st_geometry(sf_district), add = TRUE)

enter image description here