OpenstreetMap Overpass API:如何结合含/不含addr:country的查询?
当然可以把这两种查询逻辑结合起来!我给你两种实用的实现方式,刚好匹配你的需求:
方案一:合并查询集合(简单直接)
这种方式是把带addr:country='DE'和不带该条件的way查询合并到一起,确保无论哪种情况都能获取到目标way,再统一查询周围的公交站。
[out:json]; ( way['addr:street'='Kurzenmoor']['addr:housenumber'='12']['addr:postcode'='25370']['addr:country'='DE']; way['addr:street'='Kurzenmoor']['addr:housenumber'='12']['addr:postcode'='25370']; ); out body; // 去重,避免同一个way被重复选中 node(around:700)['highway'='bus_stop'][!'ref']; out;
优点:写法简单,不需要复杂的条件判断,能覆盖所有可能的情况——如果带国家参数的way存在就会被选中,不存在的话就会用不带参数的way。
方案二:条件分支查询(精准可控)
如果你希望优先使用带addr:country='DE'的way,只有当它不存在时才 fallback 到不带参数的查询,那么可以用Overpass的计数和条件判断语法来实现:
[out:json]; // 先统计带国家参数的way数量 way['addr:street'='Kurzenmoor']['addr:housenumber'='12']['addr:postcode'='25370']['addr:country'='DE']; count into :way_count; // 根据计数结果选择对应的way查询 if (:way_count > 0) { way['addr:street'='Kurzenmoor']['addr:housenumber'='12']['addr:postcode'='25370']['addr:country'='DE']; } else { way['addr:street'='Kurzenmoor']['addr:housenumber'='12']['addr:postcode'='25370']; }; // 基于选中的way查询周围的公交站 node(around:700)['highway'='bus_stop'][!'ref']; out;
优点:逻辑更清晰,只会选择一组way(优先带国家参数的),不会出现重复处理同一个way的情况,适合对数据优先级有要求的场景。
两种方案都能完美解决你的问题,你可以根据自己的实际需求来选~
内容的提问来源于stack exchange,提问作者TheNiceGuy




