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

使用Leaflet显示地图路径遇错,请求协助排查问题

解决Leaflet结合osrm显示路径的报错问题

问题场景

尝试通过osrmRoute获取两点间路径,并用Leaflet在地图上绘制路径时,运行以下代码触发错误:

library(leaflet)
library(osrm)

route = osrmRoute(c(115.6813467,-32.0397559), c(150.3715249,-33.8469759),overview = "simplified")
route_summary = osrmRoute(c(115.6813467,-32.0397559), c(150.3715249,-33.8469759), overview = FALSE)

leaflet() %>% addTiles() %>% 
  addMarkers(c(115.6813467,150.3715249), c(-32.0397559,-33.8469759))%>% 
  addPolylines(route$lon,route$lat, 
               label = paste(round(route_summary[1]/60), 'hr - ', round(route_summary[2]), 'km'), 
               labelOptions = labelOptions(noHide = TRUE))

报错信息:

Error in validateCoords(lng, lat, funcName, mode = "polygon") :
addPolylines requires non-NULL longitude/latitude values

核心问题是route对象没有$lon和$lat字段,无法直接提取坐标。

错误原因

当前版本的osrmRoute在设置overview="simplified"时,返回的是sf类型的空间对象,而非传统的数据框,因此无法通过$lon/$lat直接访问坐标。

修复方案

提供两种可行的解决方式:

方式1:从sf对象中提取坐标数据

使用sf::st_coordinates()将路径的几何信息提取为坐标矩阵,再转成数据框供Leaflet使用:

library(leaflet)
library(osrm)
library(sf)

# 获取路径(sf对象)
route = osrmRoute(c(115.6813467,-32.0397559), c(150.3715249,-33.8469759),overview = "simplified")
# 获取路径摘要信息
route_summary = osrmRoute(c(115.6813467,-32.0397559), c(150.3715249,-33.8469759), overview = FALSE)

# 提取坐标并转成数据框
route_coords = as.data.frame(st_coordinates(route))

# 绘制地图
leaflet() %>% 
  addTiles() %>% 
  addMarkers(lng = c(115.6813467,150.3715249), 
             lat = c(-32.0397559,-33.8469759)) %>%
  addPolylines(lng = route_coords$X, 
               lat = route_coords$Y,
               label = paste(round(route_summary[1]/60), 'hr - ', round(route_summary[2]), 'km'), 
               labelOptions = labelOptions(noHide = TRUE))

方式2:直接传入sf对象到addPolylines

Leaflet原生支持sf空间对象,可直接将route传入addPolylines,无需手动提取坐标:

library(leaflet)
library(osrm)

route = osrmRoute(c(115.6813467,-32.0397559), c(150.3715249,-33.8469759),overview = "simplified")
route_summary = osrmRoute(c(115.6813467,-32.0397559), c(150.3715249,-33.8469759), overview = FALSE)

leaflet() %>% 
  addTiles() %>% 
  addMarkers(lng = c(115.6813467,150.3715249), 
             lat = c(-32.0397559,-33.8469759)) %>%
  addPolylines(data = route,
               label = paste(round(route_summary[1]/60), 'hr - ', round(route_summary[2]), 'km'), 
               labelOptions = labelOptions(noHide = TRUE))

效果验证

运行上述任意一种代码后,地图将显示两点的标记、规划的路径,并且路径上会固定显示行驶时长和距离的标签。

内容的提问来源于stack exchange,提问作者Gabriela Cvečková

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:23