2

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

4

1 回答 1

5

这可能有点复杂。首先,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* 和道路匹配)来了解这一点。我们甚至得到了一个ID 为 94892819 的对应方式,它具有建筑物标签,并在查询 API 以获取方式 ID时包含建筑物轮廓的坐标(请参阅API 文档)。

但如前所述,并非每个地址都属于建筑物。例如,在搜索 Huttenstraße 14, Dresden时,我们也得到了准确的结果,但返回的 ID 为 240398228的方式属于一个area。该区域包含因此属于该地址的建筑物。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>

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

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

于 2013-10-04T18:07:00.727 回答