手动导出OSM数据出现1KB空文件问题,求自动导出的Python/Julia命令
OSM导出空文件问题排查
- 查询参数或语法错误:手动导出生成的Overpass查询可能存在坐标格式错误,或者过滤条件过于苛刻(比如误选了无数据的标签分类),导致返回空结果。可以手动检查导出的查询语句,简化过滤条件后重试。
- API服务异常:公共Overpass实例可能临时限流、维护或负载过高,换个不同的公共实例地址重试试试。
- 区域无数据:你选的区域可能确实没有OSM贡献的数据(比如偏远无人区),可以先选城市中心这类数据密集区测试。
- 请求格式问题:部分导出工具生成的请求可能缺少必要的请求头,或者指定的输出格式不兼容,导致返回空响应体。
Python 自动下载指定坐标区域OSM数据
用osmnx库最方便,它封装了Overpass API的调用:
import osmnx as ox # 定义坐标范围:(最小经度, 最小纬度, 最大经度, 最大纬度) bbox = (116.3, 39.8, 116.5, 40.0) # 下载区域内所有OSM数据并保存为GeoJSON osm_gdf = ox.geometries_from_bbox(bbox, tags={}) osm_gdf.to_file("osm_data.geojson", driver="GeoJSON")
如果需要自定义查询逻辑,用requests直接发请求:
import requests import json overpass_url = "https://overpass-api.de/api/interpreter" # 构造Overpass QL查询,指定坐标范围和要获取的元素类型 query = f""" [out:json]; ( node({bbox[1]},{bbox[0]},{bbox[3]},{bbox[2]}); way({bbox[1]},{bbox[0]},{bbox[3]},{bbox[2]}); relation({bbox[1]},{bbox[0]},{bbox[3]},{bbox[2]}); ); out body; >; out skel qt; """ resp = requests.get(overpass_url, params={"data": query}) data = resp.json() # 保存为JSON文件 with open("osm_raw_data.json", "w") as f: json.dump(data, f, indent=2)
Julia 自动下载指定坐标区域OSM数据
先安装依赖包:
using Pkg Pkg.add(["OSM", "HTTP", "JSON3"])
然后用OSM库直接下载:
using OSM # 坐标范围格式:(最小纬度, 最小经度, 最大纬度, 最大经度) bbox = (39.8, 116.3, 40.0, 116.5) # 下载数据并保存为OSM XML文件 osm_data = get_osm(bbox=bbox) save_osm(osm_data, "osm_data.osm")
如果需要自定义查询,用HTTP发送请求:
using HTTP, JSON3 query = """ [out:json]; ( node($(join(bbox, ","))); way($(join(bbox, ","))); relation($(join(bbox, ","))); ); out body; >; out skel qt; """ resp = HTTP.get("https://overpass-api.de/api/interpreter", query=Dict("data" => query)) data = JSON3.read(resp.body) # 保存JSON数据 open("osm_raw_data.json", "w") do f JSON3.write(f, data) end
内容的提问来源于stack exchange,提问作者Rainbow
相关产品推荐
相关产品推荐

