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

如何利用OSMnx获取道路方向,解决应急车辆最短路径的单行道启发式问题

解决OSMnx无向图中单行道方向判断与权重设置问题

先搞懂reversed属性的含义

在OSMnx生成的无向图里,reversed属性是用来标记当前边的节点顺序和原始OSM道路的官方方向是否相反:

  • 原始OSM的单行道是有明确通行方向的(比如从节点A到节点B)。
  • 当OSMnx把这条有向单行道转换成无向边时,如果生成的边节点顺序是(B, A),这条边的reversed就会设为True;如果是(A, B),则reversed为False。

实现单行道逆行的权重惩罚逻辑

你不需要GPS,直接通过边的oneway和reversed属性就能判断行驶方向是否违规,步骤如下:

  1. 创建无向图时,OSMnx默认会保留所有道路属性,无需额外配置。
  2. 遍历每条边,根据属性判断并设置权重:
    • 若oneway为False:双向通行,用道路长度等基础权重即可。
    • 若oneway为True:
      • reversed为False:当前边的节点顺序和单行道官方方向一致,属于合规行驶,用基础权重。
      • reversed为True:当前边的节点顺序和单行道官方方向相反,属于逆行,设置你需要的负权重(或惩罚性权重)。

代码示例

import osmnx as ox

# 以目标区域创建无向驾驶路网
G = ox.graph_from_place("Beijing, China", network_type="drive", undirected=True)

# 遍历所有边,设置启发式权重
for u, v, edge_data in G.edges(data=True):
    # 取道路长度作为基础权重,默认值1防止属性缺失
    base_weight = edge_data.get("length", 1)
    
    if edge_data.get("oneway", False):
        # 处理单行道情况
        if edge_data.get("reversed", False):
            # 逆行,设置负权重(可根据需求调整惩罚力度)
            edge_data["weight"] = -base_weight
        else:
            # 顺行,使用正常权重
            edge_data["weight"] = base_weight
    else:
        # 双向道,使用正常权重
        edge_data["weight"] = base_weight

补充说明

  • 无向图中,OSMnx会为每条原始有向道路生成一条无向边,reversed属性是唯一能关联原始道路方向的标记。
  • 若需要更严谨的规则,可以结合原始OSM道路的highway类型(比如快速路单行道的惩罚力度更高),但核心判断逻辑仍基于oneway和reversed。

内容的提问来源于stack exchange,提问作者Balla Pradeep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:32:32