如何用OSMX绘制指定边?解决节点转LLA坐标的KeyError问题
问题
我有一组来自m.e的边子集,它们不一定构成路径,想要将其可视化。边列表如下:
Edges =[(42448558, 42448549) (1918039864, 42432082) (42445543, 42445548) (42429754, 486869282) (486869282, 42429754) (4321748238, 4321748237) (42437114, 4202950102) (42437608, 42437114) (1773076514, 1773076511)]
尝试可视化时,将节点ID转换为LLA坐标出现KeyError: bounds not found错误,我的代码如下:
flm = pyimport("folium") matplotlib_cm = pyimport("matplotlib.cm") matplotlib_colors = pyimport("matplotlib.colors") cmap = matplotlib_cm.get_cmap("prism") mf = flm.Map() for k=1: length(links_o ) locs = [LLA(n,m.bounds) for n in links_o[k]] flm.PolyLine( [(loc.lat, loc.lon) for loc in locs ], popup=info, tooltip=info, color=matplotlib_colors.to_hex(cmap(k/SHOW_PATHS)) ).add_to(mf) end MAP_BOUNDS = [(m.bounds.min_y,m.bounds.min_x),(m.bounds.max_y,m.bounds.max_x)] flm.Rectangle(MAP_BOUNDS, color="black",weight=6).add_to(mf) mf.fit_bounds(MAP_BOUNDS) mf
解决方案
- 过滤无效节点:
KeyError说明部分节点ID不在m.bounds的索引中,循环时先筛选有效节点,跳过节点不全的边:for k=1: length(links_o ) valid_nodes = [n for n in links_o[k] if haskey(m.bounds, n)] if length(valid_nodes) < 2 continue # 跳过无法构成边的无效数据 end locs = [LLA(n,m.bounds) for n in valid_nodes] # 后续PolyLine代码保持不变 end - 对齐数据源:确认
m.e的边子集和m.bounds属于同一地理数据集,不同来源的OSM数据节点ID可能不匹配,需重新导出统一的节点和边信息。 - 修正坐标转换对象:部分地理库中节点坐标存储在
m.nodes而非m.bounds,可尝试将LLA(n,m.bounds)替换为LLA(n, m.nodes),具体取决于你使用的工具库。 - 去重重复边:边列表中存在反向重复的边(如
(42429754, 486869282)和其反向边),先去重减少无效操作:unique_edges = unique(sort.(Edges)) # 按节点ID排序后去重,消除反向重复
内容的提问来源于stack exchange,提问作者Hemfri
相关产品推荐
相关产品推荐

