Python为OSM图指定路径边着色时返回空列表的问题求解
问题排查
你的代码存在3个核心逻辑错误,直接导致ec列表为空:
- 循环内每次执行
ec = ['r' for ...]时,会直接用仅包含当前节点对匹配边的新列表,完全覆盖之前初始化的全白边颜色列表,根本没有保留非路径边的颜色配置。 - 路径序列
node_route里存在多段连续重复节点,这类节点对对应的自环边在常规OSM路网中不存在,最后一轮循环匹配不到任何边时,会直接把ec赋值为空列表。 - 额外兼容问题:如果是无向路网,你只判断了
u为前序节点、v为后序节点的单向匹配,会漏匹配存储方向和路径方向相反的边。
修正代码
# 第一步:清洗路径,移除连续重复的无效节点 clean_route = [] for n in node_route: if not clean_route or n != clean_route[-1]: clean_route.append(n) # 第二步:生成待高亮的边集合,默认兼容无向图双向匹配 target_edges = set() for i in range(len(clean_route) - 1): u, v = clean_route[i], clean_route[i+1] target_edges.add((u, v)) target_edges.add((v, u)) # 有向图不需要高亮反向边可删除此行 # 第三步:按边顺序生成颜色列表,不再整体覆盖 ec = [] for u, v, k in G_map.edges(keys=True): ec.append('r' if (u, v) in target_edges else 'w') # 绘图 fig, ax = ox.plot_graph( G_map, node_color='r', node_edgecolor='k', node_size=40, node_zorder=3, edge_color=ec, edge_linewidth=1 )
注意:如果使用的是单向通行的有向路网,删除代码中添加反向边到
target_edges的行即可,避免高亮错误的逆行边。
内容的提问来源于stack exchange,提问作者Beatriz Santos
相关产品推荐
相关产品推荐

