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

OSMnx常见问题:如何在已生成的城市路网图上叠加绘制路径

OSMnx路网叠加最短路径解决方案

问题核心原因

  • 首次调用plt.show()后已打开的matplotlib画布会话会终止,后续绘图操作默认创建新画布,无法叠加到原有画布
  • 调用ox.plot_graph_route时未指定原有画布的坐标轴对象ax,函数会自动生成新的独立画布

方案1:一次性绘制(无交互需求,推荐)

如果不需要先单独展示路网再接收输入,直接把所有绘图逻辑放在plt.show()之前执行即可,代码示例:

import osmnx as ox
import networkx as nx
import matplotlib.pyplot as plt

# 1. 下载路网
north, west = 47.45711622150064, 8.347885652066624
south, east = 47.31625428324118, 8.69120840316829
G = ox.graph.graph_from_bbox(north, south, east, west, network_type='drive', simplify=True, retain_all=False)

# 2. 预计算边的速度和通行时间
G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)

# 3. 获取起终点对应路网节点、计算最短路径
start_node = ox.distance.nearest_nodes(G, 8.435432953597548, 47.39719131318801)
end_node = ox.distance.nearest_nodes(G, 8.636963408494227, 47.3699935785241)
route = nx.shortest_path(G, start_node, end_node, weight='travel_time')

# 4. 先画路网,再叠加路径,最后统一展示
fig, ax = ox.plot.plot_graph(G, show=False, close=False)
ox.plot_graph_route(G, route, route_linewidth=3, ax=ax, show=False, close=False)
plt.show()

方案2:交互式动态叠加(需要先展示路网,再接收用户输入)

如果需要先展示路网,等用户输入起终点后再动态叠加路径,需要开启matplotlib的交互模式,不要提前调用plt.show()阻塞进程,代码示例:

import osmnx as ox
import networkx as nx
import matplotlib.pyplot as plt

# 开启交互模式
plt.ion()

# 1. 下载并绘制路网,不阻塞展示
north, west = 47.45711622150064, 8.347885652066624
south, east = 47.31625428324118, 8.69120840316829
G = ox.graph.graph_from_bbox(north, south, east, west, network_type='drive', simplify=True, retain_all=False)
fig, ax = ox.plot.plot_graph(G, show=False, close=False)
# 刷新画布展示路网
plt.draw()
plt.pause(0.1)

# 这里可插入接收用户输入起终点坐标的逻辑,示例用固定坐标演示
G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)
start_node = ox.distance.nearest_nodes(G, 8.435432953597548, 47.39719131318801)
end_node = ox.distance.nearest_nodes(G, 8.636963408494227, 47.3699935785241)
route = nx.shortest_path(G, start_node, end_node, weight='travel_time')

# 叠加路径到已有ax上
ox.plot_graph_route(G, route, route_linewidth=3, ax=ax, show=False, close=False)
# 刷新画布显示新叠加的路径
plt.draw()

# 关闭交互模式,阻塞进程保留窗口
plt.ioff()
plt.show()

关键注意事项

  • 所有OSMnx绘图函数都要添加show=False, close=False参数,避免函数内部自动展示和关闭画布
  • 叠加绘图时必须指定ax参数为第一次绘制路网时生成的坐标轴对象,确保所有内容绘制在同一张画布上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:00:03