基于1200米距离条件的多边形分组实现技术问询
多边形邻近分组需求与实现方案
分组规则
- 与源多边形距离≤1200米的所有多边形归为一组
- 若其他多边形与该组内任意多边形距离≤1200米,则将其加入同一组,重复此过程直至无符合条件的多边形可加入
- 选取下一个未分组的多边形,重复上述流程创建新组
- 无1200米范围内邻近多边形的多边形单独成组
- 每个多边形仅能归属一个组
预期输出
需生成包含以下字段的表格:
UID:多边形唯一标识GrpID:所属组标识AvgDist:组内多边形间的平均距离
实现思路与代码
基于距离矩阵,通过连通分量分析(图论节点连通性逻辑)实现分组:将每个多边形视为节点,距离≤1200米的多边形间建立连通边,连通的节点集合即为同一组。
完整代码如下:
library(sf) library(dplyr) library(igraph) # 读取本地多边形数据(替换为你的文件路径,如Proximity_Areas.gpkg) Proximity_Areas <- st_read("Proximity_Areas.gpkg") # 生成距离矩阵(单位:米) Dist_Matrix <- st_distance(Proximity_Areas, by_element = FALSE) units(Dist_Matrix) <- "m" # 确保单位统一为米 # 构建邻接矩阵:标记距离≤1200米的多边形对为连通 adj_matrix <- as.matrix(Dist_Matrix <= 1200) diag(adj_matrix) <- FALSE # 移除多边形自身的无效连接 # 转换为无向图并提取连通分量(即分组ID) graph <- graph_from_adjacency_matrix(adj_matrix, mode = "undirected") groups <- components(graph)$membership # 将分组ID关联到原数据 Proximity_Areas <- Proximity_Areas %>% mutate(GrpID = groups) # 计算每组内的平均距离 group_avg_dist <- lapply(unique(groups), function(g) { group_polys <- Proximity_Areas %>% filter(GrpID == g) group_dist <- st_distance(group_polys, by_element = FALSE) units(group_dist) <- "m" # 单多边形组平均距离设为0,多多边形组取上三角矩阵平均值(避免重复计算) avg_dist <- ifelse(nrow(group_polys) == 1, 0, mean(group_dist[upper.tri(group_dist)])) data.frame(GrpID = g, AvgDist = round(avg_dist, 2)) }) %>% bind_rows() # 整合最终结果表格 final_result <- Proximity_Areas %>% select(UID, GrpID) %>% left_join(group_avg_dist, by = "GrpID") %>% st_drop_geometry() # 移除几何信息,保留纯属性表格 # 查看结果示例 head(final_result)
代码说明
- 距离矩阵处理:将
st_distance生成的矩阵转为布尔邻接矩阵,标记符合距离条件的连通关系 - 连通分量提取:借助
igraph包将邻接矩阵转为无向图,直接获取连通分量作为分组ID - 平均距离计算:对每组单独生成距离矩阵,通过上三角矩阵避免重复计算双向距离,单多边形组特殊处理为0
- 结果整合:将分组ID、平均距离与原数据的唯一标识合并,输出纯表格结果
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

