R语言中如何基于空间坐标最外层点构建边界多边形
基于点集外边缘点构建多边形的可行方案
所有方案均兼容sf/terra空间对象格式,可直接处理大型坐标数据集,自动排除点集内部点对边界形状的干扰:
1 凸包(Convex Hull)法
这是运算效率最高、结果最稳定的基础方案,算法会自动筛选所有位于最外层的点,生成能够包裹全部点的最小凸多边形,完全不会纳入内部点的影响,适合点集外轮廓无明显凹进的场景。sf、terra包均内置原生计算函数,不需要额外安装第三方算法包。
示例代码:
library(sf) # 加载示例坐标 lat <- c(-34.8861,-34.9845,-34.9839,-34.4555,-34.3272,-34.922,-34.7) lon <- c(118,117.721,117.118,116.789,115.785,115.843,116.5) # 转换为WGS84坐标系的sf点对象 pts <- st_as_sf(data.frame(lon, lat), coords = c("lon", "lat"), crs = 4326) # 计算凸包多边形 convex_poly <- st_convex_hull(st_union(pts)) # 可视化验证 plot(pts$geometry, pch = 16) plot(convex_poly, add = T, border = "#d62728", lwd = 2)
如果使用terra对象处理栅格配套的点数据,可直接调用terra::convHull()函数,计算逻辑完全一致。
2 凹包(Concave Hull)法
如果点集外轮廓存在明显凹进区域,凸包会把凹进的空白区域也纳入多边形范围,这时候优先选择凹包算法。该算法可通过参数调整边界的紧致程度:参数值越小边界越贴合点的凹进轮廓,参数值越大结果越接近凸包,在排除内部点的同时不会过度包裹无点的空白区域。
针对大型点集推荐使用concaveman包实现,运算速度远快于传统Alpha Shape算法,十万级点集也能秒级出结果:
# 首次使用先安装包 # install.packages("concaveman") library(concaveman) # 计算凹包,concavity参数控制边界凹进程度,length_threshold控制最小边界段长度 concave_poly <- concaveman(pts, concavity = 2, length_threshold = 0) # 可视化验证 plot(pts$geometry, pch = 16) plot(concave_poly, add = T, border = "#1f77b4", lwd = 2)
3 核密度等值线边界法
如果点集存在零散分布的离群噪点,只需要提取主体点群的外边界,可以选择基于二维核密度的等值线法:先计算点集的空间分布密度,再取指定密度分位的等值线作为边界,可自动剔除远离主体的离群点、排除内部点干扰,还能自由控制边界所包裹的点比例。
示例代码:
library(MASS) # 提取点坐标矩阵 coord_mat <- st_coordinates(pts) # 计算二维核密度 kde_res <- kde2d(coord_mat[,1], coord_mat[,2], n = 200) # 取95%分位对应的密度等值线,调整分位数可控制边界包含的点占比 contour_res <- contourLines(kde_res, levels = quantile(kde_res$z, 0.05)) # 转为sf多边形对象 dens_poly <- st_polygon(list(cbind(contour_res[[1]]$x, contour_res[[1]]$y))) |> st_sfc(crs = 4326) # 可视化验证 plot(pts$geometry, pch = 16) plot(dens_poly, add = T, border = "#2ca02c", lwd = 2)
方案选择参考:
- 点集外轮廓接近凸形、无明显凹进:优先选凸包法,运算最快、结果无参数偏差
- 点集外轮廓有明显凹进、需要严格贴合最外层点的实际分布:选凹包法,调整参数匹配边界紧致度需求
- 点集存在零散离群噪点、需要提取核心点群的分布边界:选核密度等值线法
内容的提问来源于stack exchange,提问作者Ryan Utz
相关产品推荐
相关产品推荐

