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

R使用osrm包计算数据框内两点出行距离报'lon'未找到错误如何解决

问题原因
  • osrmRoute() 要求输入的sf空间对象必须使用默认的geometry作为几何列名,你将两个点列重命名为geom_1、geom_2后,osrm识别不到几何列,就会尝试读取lon/lat坐标列,自然触发object 'lon' not found的报错。
  • osrmRoute()本身不支持向量化输入,无法在mutate中直接批量处理整列的起点、终点对,需要逐行调用函数计算。
修复代码(逐行计算,适合少量点对)
pacman::p_load(
  tidyverse,
  sf,
  osrm
)

test_1 <- data.frame(name_1 = c("a", "b"), long = c(13.371871012201932, 13.445856720780322), lat = c(52.5212875734526, 52.503693991115206)) %>%
    st_as_sf(coords = c("long", "lat"), crs = 4326) %>%
    rename(geom_1 = "geometry")

test_2 <- data.frame(name_2 = c("c", "d"), long = c(13.401224766110927, 13.349212418670756), lat = c(52.51946945798967, 52.5149481833963)) %>%
    st_as_sf(coords = c("long", "lat"), crs = 4326) %>%
    rename(geom_2 = "geometry")

comb <- expand_grid(test_1, test_2)

# 逐行处理每对起点终点
routes <- comb %>%
  mutate(distances = map2_dbl(geom_1, geom_2, function(start_point, end_point) {
    # 转换为osrm可识别的标准sf格式
    src_sf <- st_sf(geometry = start_point, crs = 4326)
    dst_sf <- st_sf(geometry = end_point, crs = 4326)
    osrmRoute(src = src_sf, dst = dst_sf, returnclass = "sf")$distance
  }))
优化方案(批量计算,适合大量点对)

如果只需要获取距离不需要完整路线数据,可以用osrmTable直接生成距离矩阵,计算效率远高于逐行遍历:

# 生成所有起点到所有终点的距离矩阵,单位为千米
dist_matrix <- osrmTable(
  src = test_1 %>% rename(geometry = geom_1), 
  dst = test_2 %>% rename(geometry = geom_2)
)$distances

# 将矩阵值按顺序匹配到comb表
comb$distances <- as.vector(t(dist_matrix))

注:运行前请确保已正确启动可用的OSRM后端服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:45:05