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
相关产品推荐
相关产品推荐

