【问题标题】:Get coordinates of a building with geocoding使用地理编码获取建筑物的坐标
【发布时间】:2013-10-04 06:56:16
【问题描述】:

我想通过地理编码获取建筑物的坐标。目前我使用 android 的 GeoCoder 类从选定的地址获取坐标,但这些不对应于建筑物的边缘。 OSM 包含每个建筑物的这些信息,但我不知道如何使用 GeoCoder 类获取这些信息。是否有可能将 OSM 与 android 的地理编码器类一起使用来获取此信息?

【问题讨论】:

    标签: java android google-maps geocoding openstreetmap


    【解决方案1】:

    这可能有点复杂。首先,OSM 并不是每个地址都有一个建筑物。有时一个建筑物包含多个地址,或者一个地址可以属于多个建筑物。

    但作为第一步,您可以使用Nominatim 进行地理编码以获取特定地址的坐标。然后将这些坐标传递给 Overpass API 并搜索附近的建筑物。

    例子:

    我们正在寻找地址为 Franzweg 4, Dresden 的建筑物。 Nominatim 查询可能如下所示(假设我们想要 JSON 输出):

    http://nominatim.openstreetmap.org/search.php?q=Franzweg+4%2C+Dresden&addressdetails=1&format=json

    它返回完全匹配,因为地址存在于 OSM 的数据库中。您可以通过查看地址详细信息看到,*house_number* 和 road 都匹配。我们甚至得到了一个对应的way with ID 94892819,它有building标签,当querying the API for the way ID时包含建筑物轮廓的坐标(见API documentation)。

    但如前所述,并非每个地址都属于建筑物。例如,当searching for Huttenstraße 14, Dresden 我们也得到了精确的结果,但返回的方式with ID 240398228 属于一个区域。该区域包含因此属于该地址的建筑物。 Nominatim 还返回一个边界框,在这种情况下 51.0508041381836,51.0514030456543,13.7778491973877,13.7796478271484。我们可以使用它来检索该区域内的对象。如果您没有 OSM 数据库的本地副本,您可以使用 Overpass API 进行以下查询:

    <osm-script output="json">
      <query type="way">
        <has-kv k="building"/>
        <bbox-query e="13.7796478271484" n="51.0514030456543" s="51.0508041381836" w="13.7778491973877"/>
      </query>
      <print mode="body"/>
      <recurse type="down"/>
      <print mode="skeleton"/>
    </osm-script>
    

    此查询returns all ways 在给定的边界框中带有 buildings 标记。您可以使用overpass turbo 来可视化结果。如您所见,边界框包含不止一栋建筑物,但其中只有一栋在该区域内。因此,您必须通过每个建筑物的坐标来查看哪个适合。请记住,一个地址可能属于多个建筑物,因此可以有多个匹配项。

    那么还有第三种情况,地址是单个node。例如Striesener Straße 38b 的结果返回node with ID 1615986605。这里的节点其实是建筑物way的一个成员,所以很容易确定对应的建筑物。但情况并非总是如此,您可能需要运行另一个 Overpass API 查询来确定附近的建筑物,并再次查看哪个最适合。

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 2012-07-18
      • 1970-01-01
      • 2021-12-18
      • 2023-03-04
      • 2020-01-16
      • 1970-01-01
      • 2021-12-03
      • 2013-05-06
      相关资源
      最近更新 更多