为什么OSRM中步行、驾车路径规划返回的时长和距离完全一致?
问题原因
导致两种出行方式返回结果完全一致,常见原因如下:
- 本地OSRM服务仅加载了单模式路网数据
OSRM不同出行方式需要基于OSM原始数据分别预处理生成对应的专属路网文件,启动服务时也需要指定对应模式的路网文件。如果你的5000端口OSRM服务启动时只加载了步行模式的路网文件,不管请求路径中写的是foot还是car,服务都会用步行路网计算,返回结果自然一致。 - OSRM服务不支持驾车模式 fallback 到步行模式
如果你部署的OSRM服务没有预处理驾车路网,请求car模式时服务没有报错,而是默认 fallback 到了唯一可用的步行模式,也会出现两类请求返回结果相同的情况。 - 请求实际打到了同一个模式的服务实例
如果你本来分别部署了步行、驾车两种模式的OSRM服务,但驾车模式的服务端口不是5000,两类请求都发到了步行模式的5000端口实例,也会得到相同结果。
验证排查方法
- 直接将代码中生成的步行、驾车两类请求url复制到浏览器调用,对比返回结果的
routes字段下的路径步骤,确认是否都是步行路径规则(比如允许走步行街、人行通道等) - 检查OSRM服务的启动命令,确认启动时加载的路网文件对应的模式是否正确,比如启动命令为
osrm-routed seoul_foot.osrm的话,仅支持步行模式计算 - 单独调用OSRM的驾车模式接口,检查返回的响应头和状态码,确认是否正常响应驾车模式请求,没有 fallback 到其他模式
对应代码格式化后如下
# -*- coding: utf-8 -*- """ Created on Fri Jul 23 14:49:45 2021 @author: ukjo """ import datetime import requests import numpy as np import pandas as pd from util import get_src_engine, get_api_engine import folium src_engine = get_src_engine() def get_public_transformation_info_from_osrm(sx, sy, dx, dy, method): ii32 = np.iinfo(np.int32) min_total_time = ii32.max if method == 'foot': url = f"http://localhost:5000/route/v1/foot/{sx},{sy};{dx},{dy}?steps=true&geometries=geojson" elif method == 'driving': url = f"http://localhost:5000/route/v1/car/{sx},{sy};{dx},{dy}" resp = requests.get(url) resp_dic = resp.json() duration = resp_dic['routes'][0]['duration'] distance = resp_dic['routes'][0]['distance'] return duration, distance if __name__ == '__main__': """ 126.9485743, 37.4794274 127.0121342, 37.4875451 """ sx = 126.9485743 sy = 37.4794274 dx = 127.0121342 dy = 37.4875451 print(f"walk time : {get_public_transformation_info_from_osrm(sx, sy, dx, dy, 'foot')}") print(f"driving time : {get_public_transformation_info_from_osrm(sx, sy, dx, dy, 'driving')}")
内容的提问来源于stack exchange,提问作者verystrongjoe
相关产品推荐
相关产品推荐

