如何在 Overpass API 查询/osm 脚本中使密钥可选?

How can I make keys optional in Overpass API queries / osm-scripts?

我找到了

<osm-script output="json" timeout="25">
  <!-- gather results -->
  <union>
    <!-- query part for: “waterway=*” -->
    <query type="way">
      <has-kv k="amenity" v="parking"/>
      <bbox-query {{bbox}}/>
    </query>
  </union>
  <!-- print results -->
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

提供许多停车位(但不考虑可以在边界停车的街道 - 可能缺少可用信息)。

不过,它也提供私人停车位。

当我添加

<has-kv k="access" v="public"/>

它删除了私有的,但也删除了几个 public 似乎没有该属性的。有没有办法 (a) "subtract" 元素(例如 <has-kv k="access" v="private"/>)或 (b) 使键的存在(例如 access)可选但强制执行一个值(例如 public) 如果是 public?

您可以使用 negation 运算符:

<has-kv k="access" modv="not" v="private"/>

你的整个查询与上面的否定:

<osm-script output="json" timeout="25">
  <!-- gather results -->
  <union>
    <!-- query part for: “waterway=*” -->
    <query type="way">
      <has-kv k="amenity" v="parking"/>
      <has-kv k="access" modv="not" v="private"/>
      <bbox-query {{bbox}}/>
    </query>
  </union>
  <!-- print results -->
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

或者在更具可读性的 OverpassQL 中:

[timeout:25]
[out:json]
;
(
  way
    ["amenity"="parking"]
    ["access"!="private"]
    {{bbox}};
);
out;
>;
out skel qt;