德国地点与街道注册表的OpenStreetMap查询优化咨询
解决德国境内地点与街道注册表的Overpass查询问题
核心问题分析
你之前的两个方案都有明显缺陷:
- 第一个查询仅通过
name="Bremen"匹配区域,会命中全球所有同名地点(比如美国的Bremen),完全无法精准定位德国境内的目标区域。 - 第二个用
around:5000半径圈选街道,本质是用圆形范围替代城市实际的行政边界,必然会包含周边不属于该城市的街道,导致数据不准确。
最优查询方案:精准绑定行政区域
直接通过国家ISO代码+行政层级锁定目标范围,再在该范围内关联地点与街道,完全无需后续聚类处理。具体思路:
- 用ISO3166-1代码
DE精准定位德国的国家级行政区域,避免名称翻译或重名问题。 - 在德国境内,通过
admin_level(行政层级)筛选出名为Bremen的目标区域(比如admin_level=4对应德国的州,admin_level=6对应城市级)。 - 对每个地点,直接限定街道必须属于该地点的行政区域,而非用半径圈选,确保街道归属准确。
完整查询代码
[out:json][timeout:60]; // 锁定德国国家级行政区域 area["ISO3166-1"="DE"]["admin_level"=2]->.germany; // 锁定德国境内名为Bremen的行政区域(这里用admin_level=4代表州,若要城市级可改为6) area["name"="Bremen"]["admin_level"="4"](area.germany)->.target_area; // 获取目标区域内所有城市、镇、村庄节点 node[place~"city|town|village"](area.target_area)->.locations; // 遍历每个地点,获取其所属行政区域内的街道 foreach.locations ->.loc { // 定位当前地点对应的次级行政区域(比如镇/市的边界) area(around:100, .loc)[admin_level~"6|8"]->.loc_area; // 筛选该区域内的所有有名称的街道 way[highway][name](area.loc_area); (._;>;); // 关联街道的节点数据 out body; // 输出街道信息 out body qt; // 输出对应地点信息,方便关联 }
方案优势
- 精准无歧义:用ISO代码和行政层级彻底避免重名地点的干扰,只获取德国境内的目标数据。
- 归属准确:通过行政区域而非半径圈选街道,确保街道确实属于对应地点的管辖范围。
- 灵活可调:修改
admin_level的值可以切换查询范围(比如从州级缩小到城市级),适配不同需求。
内容的提问来源于stack exchange,提问作者kfaria
相关产品推荐
相关产品推荐

