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

基于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)

代码说明

  1. 距离矩阵处理:将st_distance生成的矩阵转为布尔邻接矩阵,标记符合距离条件的连通关系
  2. 连通分量提取:借助igraph包将邻接矩阵转为无向图,直接获取连通分量作为分组ID
  3. 平均距离计算:对每组单独生成距离矩阵,通过上三角矩阵避免重复计算双向距离,单多边形组特殊处理为0
  4. 结果整合:将分组ID、平均距离与原数据的唯一标识合并,输出纯表格结果

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:05:29