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

R中如何合并无分组属性的相邻sf多线串(MULTILINESTRING)对象

解法思路

通过几何邻接关系自动识别连通的线段组,再按组合并要素,无需提前设置分组属性。你可以直接用以下代码实现需求:

完整实现代码

# 加载依赖包
library(sf)
library(dplyr)
library(igraph)

# 示例数据
s1 <- st_multilinestring(list(rbind(c(0,3), c(0,4))))
s2 <- st_multilinestring(list(rbind(c(0,4), c(1,5))))
s3 <- st_multilinestring(list(rbind(c(1,5), c(2,5))))
s4 <- st_multilinestring(list(rbind(c(2,5), c(2.5,5))))
s5 <- st_multilinestring(list(rbind(c(2.7,5), c(4,5))))
s6 <- st_multilinestring(list(rbind(c(4,5), c(4.5,4))))
s7 <- st_multilinestring(list(rbind(c(4.5,4), c(5,4))))

sf_ml <- st_sf(section = 1 ,geometry=st_sfc(list(s1,s2,s3,s4,s5,s6,s7)))

# 1. 计算线段间的邻接关系(端点接触即判定为相邻)
adj_mat <- st_touches(sf_ml, sparse = FALSE)
# 2. 基于邻接关系识别连通分量(同一连通分量为同一组线段)
g <- graph_from_adjacency_matrix(adj_mat)
sf_ml$group_id <- components(g)$membership
# 3. 按分组合并要素
sf_merged <- sf_ml %>% 
  group_by(group_id) %>% 
  summarise(section = first(section), .groups = "drop")

# 查看结果
print(sf_merged)

结果验证

运行上述代码后输出的sf_merged和你期望的结果完全一致,共2个要素,分别对应前4条连通线段和后3条连通线段的合并结果。

扩展说明

如果线段之间存在微小缝隙不是严格端点接触,可以把st_touches替换为st_is_within_distance,并设置合适的距离阈值参数dist,即可实现容差合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:48:03