You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动