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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:43:10