使用OSMnx计算两点出行时间结果偏差问题求助
OSMnx计算出行时间与实际偏差的排查与解决方法
以下是针对你遇到的OSMnx计算出行时间远低于实际的问题,从数据、参数、算法三个维度的排查方向和解决步骤:
1. 核查路网数据的准确性与完整性
- 问题可能点:
graph_from_place("Distrito do Porto")下载的路网可能存在边界遗漏,或者OSM数据中道路的交通属性(如单行线、禁行规则)缺失/错误,导致算法选择了现实中不可行的捷径。simplify=False保留的冗余节点可能引入无效连接关系。
- 解决操作:
- 可视化路网和计算出的路径,对比现实路线:
path = nx.shortest_path(G, origin, destin, weight='travel_time') ox.plot_graph_route(G, path, node_size=0, edge_linewidth=2) - 抽样检查道路核心属性,确认是否符合实际交通规则:
# 查看前10条边的关键属性 for u, v, data in list(G.edges(data=True))[:10]: print(f"道路类型: {data.get('highway')}, 单向: {data.get('oneway')}, 限速: {data.get('maxspeed')}, 计算速度: {data.get('speed_kph')}") - 尝试用
graph_from_bbox下载更精准的区域,避免行政边界带来的路网缺失:# 根据起止坐标设置边界(lat_min, lat_max, lon_min, lon_max) G = ox.graph_from_bbox(41.17, 41.25, -8.62, -8.51, network_type="drive", simplify=False)
- 可视化路网和计算出的路径,对比现实路线:
2. 修正速度赋值逻辑
- 问题可能点:
ox.speed.add_edge_speeds()默认使用的道路限速基于通用规则,和葡萄牙波尔图当地的实际限速不符(比如默认速度偏高),导致计算的旅行时间偏短。 - 解决操作:
- 自定义符合当地交通规则的道路限速,覆盖默认值:
# 参考葡萄牙限速标准设置各道路类型的默认速度(单位:km/h) hwy_speeds = { 'motorway': 120, 'trunk': 100, 'primary': 90, 'secondary': 70, 'tertiary': 50, 'residential': 50, 'living_street': 20 } # 重新添加速度和旅行时间 G = ox.speed.add_edge_speeds(G, hwy_speeds=hwy_speeds) G = ox.speed.add_edge_travel_times(G, precision=1)
- 自定义符合当地交通规则的道路限速,覆盖默认值:
3. 验证路径算法的合理性
- 问题可能点:
虽然nx.shortest_path_length使用的Dijkstra算法逻辑正确,但如果路网存在连通性问题(比如OSM中标记为连通的道路现实中是断路),算法会选择实际不可行的短时间路径。 - 解决操作:
- 对比OSMnx生成的路径和谷歌地图的推荐路线,查看是否存在明显差异(如走了未开放道路、步行道)。
- 检查路网连通性,确认起止节点属于同一个连通分量:
from networkx import is_connected # 转换为无向图检查连通性 print(is_connected(G.to_undirected()))
额外细节检查
- 确认
ox.nearest_nodes的参数顺序正确性,核对节点坐标与输入坐标的距离是否合理:origin_node = ox.nearest_nodes(G, o_longitude, o_latitude) origin_lat, origin_lon = G.nodes[origin_node]['y'], G.nodes[origin_node]['x'] print(f"输入坐标: ({o_latitude}, {o_longitude}), 匹配节点坐标: ({origin_lat}, {origin_lon})")
内容的提问来源于stack exchange,提问作者Beatriz Santos
相关产品推荐
相关产品推荐

