使用地理编码获取建筑物的坐标

Irg*_*ter 2 java android google-maps geocoding openstreetmap

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

sca*_*cai 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 *和道路匹配),您可以看到这一点。当查询API的方法ID时,我们甚至获得了ID为94892819的对应方法,该方法具有建筑物标签并包含建筑物轮廓的坐标(请参阅API文档)。

但是,如上所述,并非每个地址都属于一栋建筑物。例如,当搜索 德累斯顿的Huttenstraße14时,我们还获得了准确的结果,但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>
Run Code Online (Sandbox Code Playgroud)

该查询以给定的边界框内的建筑物标记返回所有方式。您可以使用立交桥涡轮增压器可视化结果。如您所见,边界框包含一栋以上的建筑物,但其中只有一栋在该区域内。因此,您必须遍历每座建筑物的坐标才能确定适合的建筑物。请记住,一个地址可能属于多个建筑物,因此单个匹配项可能会超过一个。

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