如何用sf包从点数据框生成连续的LineString?
解决sf包创建LineString时点顺序混乱导致的锯齿状问题
问题原因
你生成的线呈锯齿状,核心原因是点的排列顺序不符合路径逻辑:st_cast("LINESTRING")会严格按照数据框中点的现有顺序连接,当分组后的点跨子线跳转、子线内部点顺序颠倒时,就会出现左右跳转的情况。
解决方案(基于现有点数据框)
要生成连续的LineString,需要先恢复两个层级的顺序:每个子线(LINE_ID)内部的点按原始路径排序,再按LINE_ID的顺序串联所有子线的点,最后再分组生成线。
# 1. 先整理点的顺序 test_lines_ordered <- test_lines %>% # 对每个LINE_ID的点,按原始路径顺序排序(这里用点到子线起点的距离排序,若有原始POINT_ORDER列直接用该列排序更准确) group_by(LINE_ID) %>% arrange(st_distance(st_sfc(st_point(c(first(x), first(y))), st_sfc(st_point(c(x, y))), by_element = TRUE))) %>% ungroup() %>% # 按NEW_ID和LINE_ID排序,确保子线的合并顺序正确 arrange(NEW_ID, LINE_ID) # 2. 创建正确的LineString new_lines <- test_lines_ordered %>% st_as_sf(coords = c("x", "y"), crs = 25832) %>% group_by(NEW_ID) %>% dplyr::summarize() %>% st_cast("LINESTRING") plot(new_lines[1,])
更高效的替代方案(直接从原始LineString列表合并)
如果你的点是从LineString列表拆分而来,建议直接合并原始线,避免点顺序混乱:
# 假设原始LineString列表已转为sf对象,包含NEW_ID和LINE_ID字段 line_sf <- your_original_line_sf %>% group_by(NEW_ID) %>% summarize(geometry = st_union(geometry)) %>% st_cast("LINESTRING")
这种方法会直接保留原始LineString的点顺序,无需额外排序操作。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

