如何在R中无需预分组为点集生成3个多边形(替代单一凹包)
生成多个凹包多边形(无需预定义分组)
问题描述
现有一组空间点数据,当前代码仅能生成1个凹包多边形,但需要生成3个。st_concave_hull没有直接控制生成数量的参数,需在无需预先定义分组的前提下实现该需求。
原代码如下:
library(sf) library(tidyverse) chull_polytd <- td %>% st_transform(., crs="EPSG:4326") %>% summarise( geometry = st_combine( geometry ) ) %>% st_buffer(., dist = 20000) %>% st_concave_hull(., dfMaxLength = 50000, allow_holes = FALSE, ratio = 0.1) ggplot() + geom_sf(data = chull_polytd)+ geom_sf(data =td)
解决方案
核心思路是先通过空间聚类自动分组点集,再对每组分别生成凹包。这里使用DBSCAN聚类算法,根据点的空间距离自动划分簇,无需手动定义分组。
步骤1:加载所需包
除sf和tidyverse外,还需dbscan包实现空间聚类:
library(sf) library(tidyverse) library(dbscan)
步骤2:空间聚类分组
提取点坐标,用DBSCAN划分3个簇。需根据数据空间尺度调整eps参数(距离阈值),针对你的数据设置如下:
# 提取点的坐标矩阵 coords <- st_coordinates(td) # DBSCAN聚类,设置参数确保生成3个簇 clusters <- dbscan(coords, eps = 50000, minPts = 1) %>% pluck("cluster") # 将聚类结果加入原数据框 td_clustered <- td %>% mutate(cluster = as.factor(clusters))
步骤3:按聚类分组生成凹包
对每个聚类组分别执行凹包生成操作:
chull_polytd_multi <- td_clustered %>% st_transform(crs = "EPSG:4326") %>% group_by(cluster) %>% summarise(geometry = st_combine(geometry)) %>% st_buffer(dist = 20000) %>% st_concave_hull(dfMaxLength = 50000, allow_holes = FALSE, ratio = 0.1)
步骤4:可视化结果
绘制点集和多个凹包,区分不同聚类组:
ggplot() + geom_sf(data = chull_polytd_multi, aes(fill = cluster), alpha = 0.3) + geom_sf(data = td_clustered, aes(color = cluster), size = 2) + theme_minimal()
关键说明
- DBSCAN的
eps参数需匹配数据单位:你的原始数据使用GDA94/Australian Albers(米为单位),eps=50000代表50公里距离阈值,可确保前两个孤立点各成一个簇,密集点组成第三个簇。 - 调整簇数量可修改
eps值:减小eps会生成更多簇,增大则会合并簇。
内容的提问来源于stack exchange,提问作者we need a Mat. Stat.
相关产品推荐
相关产品推荐

