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

