如何利用OSMnx获取道路方向,解决应急车辆最短路径的单行道启发式问题
解决OSMnx无向图中单行道方向判断与权重设置问题
先搞懂reversed属性的含义
在OSMnx生成的无向图里,reversed属性是用来标记当前边的节点顺序和原始OSM道路的官方方向是否相反:
- 原始OSM的单行道是有明确通行方向的(比如从节点A到节点B)。
- 当OSMnx把这条有向单行道转换成无向边时,如果生成的边节点顺序是
(B, A),这条边的reversed就会设为True;如果是(A, B),则reversed为False。
实现单行道逆行的权重惩罚逻辑
你不需要GPS,直接通过边的oneway和reversed属性就能判断行驶方向是否违规,步骤如下:
- 创建无向图时,OSMnx默认会保留所有道路属性,无需额外配置。
- 遍历每条边,根据属性判断并设置权重:
- 若
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
相关产品推荐
相关产品推荐

