如何从OpenStreetMap获取指定国家聚居地的街道列表并解决地名重名问题
Overpass QL 限定国家范围查询解决方案
问题核心原因
原查询没有限定行政范围,会匹配全球所有名为Fulda的聚居地对应的街道数据,因此出现跨国家的同名地点结果干扰。
修改后的查询实现
你可以通过两级区域嵌套筛选的方式先锁定目标国家范围,再在该范围内搜索目标聚居地,就能解决歧义问题。以下是修改后的完整Python代码:
import requests overpass_url = "http://overpass-api.de/api/interpreter" overpass_query = """ [out:json]; // 第一步:定位德国(用ISO3166-1国家码匹配比名称匹配更精准) area["ISO3166-1"="DE"]["admin_level"="2"]->.country; // 第二步:在德国范围内搜索名为Fulda的聚居地 area[name="Fulda"](area.country); // 第三步:筛选该区域内有名称的公路数据 way(area)[highway][name]; out; """ response = requests.get(overpass_url, params={'data': overpass_query}) data = response.json()
规则说明
- 替换国家时只需要修改
ISO3166-1的属性值即可,比如美国对应US、法国对应FR,不需要修改国家名称,避免多语言名称匹配误差 - 如果同一个国家内仍有多个同名聚居地,可以给第二级的area查询增加行政级别筛选,比如德国的地级市一般对应
admin_level="6",修改后为area[name="Fulda"]["admin_level"="6"](area.country);,可进一步缩小范围 - 提取街道名称时,遍历返回的
elements数组,取每个元素的tags.name属性即可得到对应的街道名列表
查询编写小技巧
编写Overpass查询时可以先通过可视化工具验证查询逻辑是否正确,确认返回结果符合预期后再集成到业务代码中,能大幅降低调试成本。常用的标签规则、查询语法可以参考官方的标签说明文档。
内容的提问来源于stack exchange,提问作者Stanislav Koncebovski
相关产品推荐
相关产品推荐

