2013-10-04 55 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查詢來確定附近的建築物,然後再次查看哪個最適合。