You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:49:50