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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:32:50