如何在Julia中用OSMX.jl将JSON数据整合至现有OSM文件?
解决Overpass JSON与现有OSM文件的整合问题
一、先将Overpass JSON转换为标准OSM格式
Overpass-turbo导出的JSON是其专属格式,必须先转成OSM XML格式(即现有.osm文件使用的格式),才能进行合并。
命令行工具方案(推荐,高效稳定)
使用osmium-tool(OpenStreetMap官方推荐的处理工具):
- 安装对应系统的osmium-tool(比如Ubuntu用
apt install osmium-tool,macOS用brew install osmium-tool) - 转换JSON到OSM:
osmium convert your_overpass_export.json -o converted_transit_data.osm - 合并两个OSM文件:
osmium merge nyc_existing.osm converted_transit_data.osm -o merged_nyc_transit.osm
- 优势:自动处理重复元素ID,无需手动写逻辑,速度快。
二、代码实现(Julia OSMX.jl / Python)
Julia 基于OSMX.jl的方案
- 安装依赖:
using Pkg Pkg.add("OSMX") - 加载并合并数据:
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,底层高效)
- 安装依赖:
pip install osmium - 转换+合并代码:
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
相关产品推荐
相关产品推荐

