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
相关产品推荐
相关产品推荐

