自行部署OSRM服务器调用osrmTable时返回res对象未找到错误如何解决
OSRM调用报错排查与解决步骤
第一步:校验入参格式合法性
osrmTable的第一个输入参数loc要求必须是至少包含*lon(经度)、lat(纬度)*两列的data.frame,或者是WGS84(EPSG:4326)投影的sf POINT类型空间对象,首先检查你的route对象是否符合要求:- 普通数据框的经纬度列名必须准确匹配
lon、lat,大小写不能出错 - 所有点位的经纬度必须在你部署OSRM时加载的地图数据覆盖范围内
- 普通数据框的经纬度列名必须准确匹配
- 点位数量不要超过OSRM服务的最大查询限制,默认OSRM的table接口最多支持100个点位同时查询,超过会返回400错误,R包的异常处理逻辑未提前初始化
res对象就会触发你遇到的报错。
第二步:校验OSRM服务可用性
- 直接调用OSRM原生接口测试服务是否正常响应,替换示例坐标为你自己的点位,在浏览器或终端执行curl请求:
http://0.0.0.0:5000/table/v1/car/116.39,39.9;116.4,39.91?annotations=duration,distance- 若返回404,检查OSRM启动时是否正确加载了地图数据、路径配置是否匹配car profile
- 若返回403,检查服务是否配置了访问限制
- 若需要查询大量点位,启动OSRM时需手动调大最大查询阈值,启动命令示例:
osrm-routed --max-table-size 1000 your_map_file.osrm
第三步:修正R代码写法
你当前的代码参数有冗余括号,先调整为标准写法:
# 先打印str(route)确认输入格式正确 get_OSRMTable <- osrmTable( loc = route, osrm.server = "http://0.0.0.0:5000/", osrm.profile = "car", measure = c("distance","duration") )
如果调整后还是报错,可降级osrm包到3.5.0版本,3.6.0及之后的版本存在异常处理逻辑bug,会偶发res对象未定义问题:
remotes::install_version("osrm", version = "3.5.0")
内容的提问来源于stack exchange,提问作者Mohammadreza Mirzaei
相关产品推荐
相关产品推荐

