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

如何在Julia中用OSMX.jl将JSON数据整合至现有OSM文件?

解决Overpass JSON与现有OSM文件的整合问题

一、先将Overpass JSON转换为标准OSM格式

Overpass-turbo导出的JSON是其专属格式,必须先转成OSM XML格式(即现有.osm文件使用的格式),才能进行合并。

命令行工具方案(推荐,高效稳定)

使用osmium-tool(OpenStreetMap官方推荐的处理工具):

  1. 安装对应系统的osmium-tool(比如Ubuntu用apt install osmium-tool,macOS用brew install osmium-tool)
  2. 转换JSON到OSM:
    osmium convert your_overpass_export.json -o converted_transit_data.osm
    
  3. 合并两个OSM文件:
    osmium merge nyc_existing.osm converted_transit_data.osm -o merged_nyc_transit.osm
    
  • 优势:自动处理重复元素ID,无需手动写逻辑,速度快。

二、代码实现(Julia OSMX.jl / Python)

Julia 基于OSMX.jl的方案

  1. 安装依赖:
    using Pkg
    Pkg.add("OSMX")
    
  2. 加载并合并数据:
    using OSMX
    
    # 读取现有NYC OSM文件
    base_osm = OSMX.read_osm("nyc_existing.osm")
    
    # 读取Overpass导出的JSON数据
    transit_json = OSMX.read_overpass("your_overpass_export.json")
    
    # 合并节点(跳过重复ID,保留原文件内容)
    for (node_id, node) in transit_json.nodes
        if !haskey(base_osm.nodes, node_id)
            base_osm.nodes[node_id] = node
        end
    end
    
    # 合并线路、站点等Way元素(按需扩展到Relation)
    for (way_id, way) in transit_json.ways
        if !haskey(base_osm.ways, way_id)
            base_osm.ways[way_id] = way
        end
    end
    
    # 保存合并后的文件
    OSMX.write_osm("merged_nyc_transit.osm", base_osm)
    
  • 可自定义重复ID的处理逻辑(比如覆盖原元素,需修改判断条件)。

Python 方案(推荐pyosmium,底层高效)

  1. 安装依赖:
    pip install osmium
    
  2. 转换+合并代码:
    import osmium
    
    # 定义处理器提取JSON中的元素
    class TransitHandler(osmium.SimpleHandler):
        def __init__(self):
            super().__init__()
            self.nodes = {}
            self.ways = {}
    
        def node(self, n):
            self.nodes[n.id] = n
    
        def way(self, w):
            self.ways[w.id] = w
    
    # 加载Overpass JSON
    handler = TransitHandler()
    handler.apply_file("your_overpass_export.json", locations=True)
    
    # 将JSON元素写入临时OSM文件
    temp_writer = osmium.SimpleWriter("temp_transit.osm")
    for node in handler.nodes.values():
        temp_writer.add_node(node)
    for way in handler.ways.values():
        temp_writer.add_way(way)
    temp_writer.close()
    
    # 合并两个OSM文件
    osmium.merge(["nyc_existing.osm", "temp_transit.osm"], "merged_nyc_transit.osm")
    
  • 如果只需要合并公交相关元素,可以在处理器中添加tag过滤(比如判断n.tags.get("highway") == "bus_stop")。

三、关键注意事项

  • 合并前备份原.osm文件,避免数据丢失
  • Overpass JSON可能包含大量非目标元素,可提前用osmium tags-filter过滤(比如osmium tags-filter converted_transit_data.osm n/highway=bus_stop w/public_transport=route -o filtered_transit.osm)
  • 若存在元素ID冲突,osmium工具和上述代码默认保留原文件内容,可根据需求调整逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:43:20