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
相关产品推荐
相关产品推荐

