如何使用 Overpass API 获取建筑洞?

How to get building holes using Overpass API?

我使用 Overpass-Turbo 和这个 XML 脚本来下载给定区域中的建筑物:

<osm-script>
  <union>
    <query type="way">
      <has-kv k="building"/>      
      <bbox-query {{bbox}}/>
    </query>
    <query type="relation">
      <has-kv k="building"/>      
      <bbox-query {{bbox}}/>
    </query>    
  </union>
  <print mode="body"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

除了里面有洞的,楼都下载的很好。 就像下面的例子,这些建筑物是由一个外部标记的建筑物=是和一个内部未标记的多边形关系(但未标记建筑物=是)组成的。

当我使用我的 Overpass 脚本时,我只得到了外部。

那么,这些建筑是正确的吗?关系不应该也被标记为建筑吗?

否则有谁知道如何select从它的外部建筑child的关系?

查询正确returns"holes",即与角色内部.

的关系方式

看到这个example. The result contains relation 7621, the outer way 23316006 as well as both inner ways 23316007 and 23316008

同样正确的是,关系本身以及内部方式都没有(也不应该)有任何构建标签。有关详细信息,请参阅 multipolygon relations in the OSM wiki

您没有告诉我们哪个应用程序的结果有问题。此应用程序可能不支持或不完全支持多边形关系。

编辑: 尝试以下查询:

<osm-script>
  <union>
    <query type="way">
      <has-kv k="building"/>      
      <bbox-query {{bbox}}/>
    </query>
    <query type="relation">
      <has-kv k="building"/>      
      <bbox-query {{bbox}}/>
    </query>    
  </union>
  <print mode="body"/>
  <recurse type="up"/>
  <recurse type="down"/>
  <print mode="skeleton" order="quadtile"/>
</osm-script>

与您的查询唯一不同的是额外的 <recurse type="up"/> 调用。

另一个编辑: 如果我理解正确的话,第一个递归步骤是修改临时数据,因此 "breaking" 第二个递归步骤。请尝试以下查询:

<osm-script>
  <query type="way">
    <has-kv k="building"/>      
    <bbox-query {{bbox}}/>
  </query>  
  <union>
    <item/>
    <recurse type="up"/>
  </union>
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print mode="body"/>
</osm-script>

如果您想获得建筑方式、包含建筑方式和其他内部方式的多边形,以及用外部和内部方式标记 "building" 的多边形,这是最终解决方案:

<osm-script>
  <query type="way">
    <has-kv k="building"/>      
    <bbox-query {{bbox}}/>
  </query>  
  <union>
    <item/>
    <recurse type="up"/>
  </union>
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print mode="body"/>

  <query type="relation">
    <has-kv k="building"/>      
    <bbox-query {{bbox}}/>
  </query>  
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print mode="body"/>
</osm-script>