Python调用Overpass查询卢森堡OSM村镇数据时Kiischpelt缺失问题
问题原因
你查询不到对应数据主要是两个常见的Overpass API使用坑导致的:
- 直接通过
area["ISO3166-1"=xxx][admin_level=2]定义查询范围的方式可靠性不足,部分地区的国家边界area没有被预生成或者标签匹配有偏差,导致后续的范围筛选失效。 - 你使用的是HTTP协议的Overpass端点,目前官方端点已经强制跳转HTTPS,部分场景下跳转过程会丢失查询参数,导致返回结果不完整。
修复方案
你可以按以下步骤调整代码:
- 先查询对应国家的admin_level=2的relation,再用
map_to_area方法手动转为查询范围,避免预生成area匹配不到的问题 - 将Overpass端点改为HTTPS协议
- 可以用正则合并重复的place标签查询,简化代码
修正后的代码如下:
import requests import json Country = 'LU' # 改为HTTPS协议的Overpass端点 overpass_url = "https://overpass-api.de/api/interpreter" overpass_query = f""" [out:json][timeout:30]; // 先查国家relation再转area,范围匹配更准确 rel["ISO3166-1"="{Country}"][admin_level=2]; map_to_area -> .search; ( node["place"~"^(city|town|village)$"](area.search); way["place"~"^(city|town|village)$"](area.search); rel["place"~"^(city|town|village)$"](area.search); ); out center; """ response = requests.get(overpass_url, params={'data': overpass_query}) response.raise_for_status() # 新增请求错误捕获,方便定位接口问题 data = response.json() filename = f"C:/Data/GetGeoData/data/{Country}cities.json" with open(filename,'w', encoding="utf-8") as f: json.dump(data, f)
如果调整后还是查询不到,你可以单独运行下面的查询语句,确认该数据在你使用的Overpass服务器节点中存在:
[out:json]; rel["name"="Kiischpelt"]["place"="town"]; out center;
内容的提问来源于stack exchange,提问作者LucGeodev
相关产品推荐
相关产品推荐

