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

R sf如何从含多组坐标列的数据框创建线要素sf对象

问题解决方法

报错原因

你使用st_as_sf的coords参数传入4个列名时,函数默认将其识别为单个点要素的4个维度坐标,而经纬度仅为二维坐标,因此触发维度不匹配的报错。coords参数仅适用于生成点要素,无法直接生成线要素。

实现代码

提供两种常用实现方式,最终得到的sf对象的geometry列均为对应ID的道路段LINESTRING要素:

方法1:dplyr + sf 行处理(可读性更高)

library(sf)
library(dplyr)

dfr_sf <- dfr %>%
  rowwise() %>% # 按行处理
  mutate(
    geometry = st_sfc(
      # 每行构造一个两点线要素,坐标顺序为(经度, 纬度)
      st_linestring(matrix(c(StartLong, StartLat, EndLong, EndLat), ncol = 2, byrow = TRUE)),
      crs = 4326 # 等价于"+proj=longlat +datum=WGS84"
    )
  ) %>%
  ungroup() %>%
  st_sf() # 转换为标准sf对象

方法2:base R 实现

library(sf)

# 逐行构造线要素列表
line_geoms <- lapply(1:nrow(dfr), function(i) {
  st_linestring(
    matrix(
      c(dfr$StartLong[i], dfr$StartLat[i], dfr$EndLong[i], dfr$EndLat[i]),
      ncol = 2,
      byrow = TRUE
    )
  )
})

# 绑定到原数据生成sf对象
dfr_sf <- st_sf(dfr, geometry = st_sfc(line_geoms, crs = 4326))

效果验证

执行st_geometry_type(dfr_sf)会返回所有要素类型为LINESTRING,直接调用plot(dfr_sf$geometry)即可绘制所有道路段折线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:45:01