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

基于sf包的多边形邻近分析、距离计算与合并实现请求

多边形邻近分析与合并实现方案

需求说明

  • 识别每个多边形的最近多边形及两者间距离
  • 获取两个多边形最近部分的坐标(用于绘制验证线段)
  • 将距离≤800米的多边形合并为多部件多边形(multipart polygons)

现有代码基础

用户已通过st_nearest_feature完成每个多边形最近UID的匹配,在此基础上实现剩余需求:

library(sf)
library(dplyr)
library(igraph) # 用于处理连通分量合并

# 加载数据集
download.file("https://drive.google.com/uc?export=download&id=1-I4F2NYvFWkNqy7ASFNxnyrwr_wT0lGF" , destfile="ProximityAreas.zip")
unzip("ProximityAreas.zip")
Proximity_Areas <- st_read("Proximity_Areas.gpkg") 

# 匹配每个多边形的最近UID
Nearest_UID <- st_nearest_feature(Proximity_Areas)
Proximity_Areas <- Proximity_Areas %>% 
  select(UID) %>% 
  mutate(NearUID = UID[Nearest_UID])

实现两个目标输出

输出1:附加距离与最近点坐标的数据集

利用st_nearest_points获取每对多边形的最近点对,计算距离并提取坐标:

# 获取每对多边形的最近点线段
nearest_points <- st_nearest_points(Proximity_Areas, Proximity_Areas[Nearest_UID, ], pairwise = TRUE)

# 计算距离并提取最近点坐标
Proximity_Areas <- Proximity_Areas %>%
  mutate(
    distance_m = st_length(nearest_points),
    # 当前多边形的最近点坐标
    start_x = st_coordinates(st_cast(nearest_points, "POINT"))[, 1],
    start_y = st_coordinates(st_cast(nearest_points, "POINT"))[, 2],
    # 最近多边形的最近点坐标
    end_x = st_coordinates(st_cast(nearest_points, "POINT"))[, 3],
    end_y = st_coordinates(st_cast(nearest_points, "POINT"))[, 4]
  )

# 查看结果示例
head(Proximity_Areas)

注意:需确保数据集使用投影坐标系(如UTM),否则st_length返回的距离单位为度,需转换为米。

输出2:合并距离≤800米的多边形

需处理双向邻近关系,将所有互相邻近(距离≤800米)的多边形合并为同一多部件多边形:

# 1. 筛选有效配对并去重(避免A-B、B-A重复)
valid_pairs <- Proximity_Areas %>%
  st_drop_geometry() %>%
  filter(distance_m <= 800) %>%
  mutate(
    min_uid = pmin(UID, NearUID),
    max_uid = pmax(UID, NearUID)
  ) %>%
  distinct(min_uid, max_uid, .keep_all = TRUE) %>%
  select(UID, NearUID)

# 2. 构建连通图,识别所有连通分量
connect_graph <- graph_from_data_frame(valid_pairs, directed = FALSE)
component_mapping <- components(connect_graph)
Proximity_Areas <- Proximity_Areas %>%
  mutate(component_id = component_mapping$membership[as.character(UID)])

# 3. 按连通分量合并多边形
merged_polygons <- Proximity_Areas %>%
  group_by(component_id) %>%
  summarise(geometry = st_union(geometry), .groups = "drop") %>%
  # 保持与原数据结构一致,生成合并后的UID
  mutate(UID = paste0("merged_", component_id)) %>%
  select(UID, geometry)

# 可视化合并结果
plot(merged_polygons["geometry"])

说明:st_union会将同一分量内的多边形合并为单个multipart polygon,可根据原数据结构调整字段保留逻辑。

内容的提问来源于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 21:15:47