我想用地理编码得到建筑物的坐标。目前,我使用android的geocoder类从选定的地址获取坐标,但这些坐标与建筑物的边缘不对应。osm包含了每个建筑的这些信息,但是我不知道如何使用geocoder类获取这些信息。有没有可能在android的geocoder类中使用osm来获取这些信息?
最佳答案
这可能有点复杂。首先,osm并不是每一个地址都有一个建筑物。有时一个建筑物包含几个地址,或者一个地址可以属于几个建筑物。
但作为第一步,您可以使用Nominatim进行地理编码,以获得特定地址的坐标。然后将这些坐标传递到天桥api并搜索附近的建筑。
例子:
我们正在寻找德累斯顿弗兰兹韦格4号的地址。nominame查询可能如下所示(假设我们需要json输出):
http://nominatim.openstreetmap.org/search.php?q=Franzweg+4%2C+Dresden&addressdetails=1&format=json
它返回一个精确匹配,因为地址存在于OSM的数据库中。你可以通过查看地址的详细信息,房子号码和道路匹配。我们甚至得到了一个对应的way with ID 94892819,它有building标记,包含querying the API for the way ID时建筑轮廓的坐标(参见API documentation)。
但如前所述,并非每个地址都属于一栋楼。例如,当searching forhuttenstra_e 14时,我们也得到了一个精确的结果,但是返回的with ID 240398228属于一个区域。这个地区有一座建筑物,因此属于这个地址。nominim还返回一个边界框,在本例中为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查询来确定附近的建筑物,并再次查看哪个最适合。