2013-10-04 50 views
2

我想通过地理编码获取建筑物的坐标。此刻,我使用GeoCoder类为android从所选地址获取坐标,但这些并不对应建筑物的边缘。 OSM包含每个建筑物的这些信息,但我不知道如何使用GeoCoder类获取这些信息。是否有可能使用OSM的地理编码器类为Android获取此信息?使用地理编码获取建筑物的坐标

回答

4

这可能会更复杂一点。首先,OSM没有每个建筑物的地址。有时一座建筑物包含多个地址,或者一个地址可能属于多个建筑物。

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

例子:

我们正在寻找的建设地址Franzweg 4,德累斯顿。该Nominatim查询看起来是这样的(假设我们想JSON输出):

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

因为地址在OSM数据库中存在,则返回精确匹配。你可以看到通过查看地址详细信息,* house_number *和匹配。我们甚至可以得到相应的way with ID 94892819,其中有building标记,并包含querying the API for the way ID(请参阅API documentation)时的建筑物轮廓的坐标。

但如前所述,并非每个地址都属于建筑物。例如,当searching forHuttenstraße14,德累斯顿我们还可以得到精确的结果,但返回的方式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所有方式建筑物在给定的边界框标签。您可以使用overpass turbo来显示结果。如您所见,边界框包含多个建筑物,但其中只有一个建筑物位于该区域内。所以你必须通过每个建筑物的坐标来看看哪一个适合。请记住,一个地址可能属于多个建筑物,因此可以有多个单一的匹配。

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