如何在R中为sf包的成对POINT要素绘制独立连线?
解决sf中为每行成对POINT生成独立连线的问题
你遇到的问题很典型——summarise(do_union=F)会把所有几何要素按顺序拼接成一条连续线,而不是每行的两个点单独连线。下面给你两种简单有效的解决方案:
方法一:使用rowwise()逐行处理
我们可以按行遍历数据框,把每行的两个POINT要素合并成一个LINESTRING:
library(sf) library(dplyr) # 你的原始数据 points1 <- data.frame(foo = seq(15, 75, 15), long = c(-85, -80, -78, -75, -82), lat = c(34, 36, 37, 38, 35)) %>% st_as_sf(coords = c('long', 'lat'), crs = 4326) points2 <- data.frame(bar = seq(15, 75, 15), long = c(85, 80, 78, 75, 82), lat = c(30, 32, 34, 36, 38)) %>% st_as_sf(coords = c('long', 'lat'), crs = 4326) df <- cbind(points1, points2) # 逐行生成独立连线 lines_df <- df %>% rowwise() %>% mutate( line = st_combine(c(geometry, geometry.1)) %>% st_cast("LINESTRING") ) %>% ungroup() %>% st_set_geometry("line") # 查看结果并绘图 print(lines_df) plot(lines_df)
方法二:使用apply批量生成线要素
如果偏好基础R的写法,也可以用apply来处理每一行:
# 生成线要素列表 line_list <- apply(df, 1, function(row) { st_cast(st_combine(c(row$geometry, row$geometry.1)), "LINESTRING") }) # 转换为sf对象 lines_df <- st_sf( foo = df$foo, bar = df$bar, geometry = st_sfc(line_list), crs = 4326 ) # 绘图 plot(lines_df)
这两种方法都会生成5条独立的LINESTRING,对应每行的一对POINT,完美解决你的需求。
内容的提问来源于stack exchange,提问作者Anthony W
相关产品推荐
相关产品推荐

