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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:05:33