Overpass查询:如何提取关系中至少带一个tag的所有node与way
Overpass查询:筛选multipolygon关联的带标签元素
需求说明
在指定bbox范围内检索所有type=multipolygon的relation,提取这些relation关联成员中至少带有1个tag的way与node元素。
原有查询会返回所有关联成员,包含大量无tag的几何构成节点,无法满足筛选要求,原有代码如下:
[bbox: 48.18329,16.3765,48.18466,16.37787]; rel["type" = "multipolygon"] -> .relation; way(r.relation); (._;>>;;); /*end of auto repair*/ out body;
实现方案
Overpass QL中可以用正则过滤器[~"."~"."]匹配所有带至少1个非空tag的元素:该过滤器会匹配任意非空键名、对应非空值的标签,刚好覆盖「至少带1个tag」的筛选规则,不需要枚举所有可能的标签键。
优化后的查询代码如下:
[bbox: 48.18329,16.3765,48.18466,16.37787]; // 筛选范围内所有multipolygon类型的relation rel["type"="multipolygon"] -> .multipolygons; // 提取所有关联成员中带至少1个tag的way、node ( way(r.multipolygons;>>;)[~"."~"."]; node(r.multipolygons;>>;)[~"."~"."]; // 若需要同时返回原始multipolygon relation,取消下一行注释即可 // .multipolygons; ); out body;
逻辑说明
r.multipolygons;>>;表示递归获取目标relation的所有层级成员,覆盖嵌套relation、way、node的全量关联元素- 后缀的
[~"."~"."]直接在取元素阶段完成过滤,排除所有无tag的几何构成节点、无tag的内部way,不需要额外做结果集筛选,查询效率更高 - 如果后续需要调整筛选规则,比如只保留带名称的元素,直接把正则过滤器替换为
["name"]即可
内容的提问来源于stack exchange,提问作者Federico Gentile
相关产品推荐
相关产品推荐

