2013-03-30 30 views
2

爲了學習,我們必須開發一個基於位置的Android遊戲。目前我們使用OSMDroid來顯示地圖。有玩家必須收集的資源(如木頭,石頭......)。這些資源當前存儲在我們的後端,具有硬編碼的長/經度,並將與setMarker一起添加到當前地圖上。 爲了在全球範圍內提供這款遊戲,我們希望根據「真實」世界動態設置資源。所以我們需要來自OSM的不同層(如森林,海洋等)來自動設置我們的資源,而不需要詢問我們的後端。 經過幾個小時與谷歌搜索後,我發現,立交API似乎可以幫助我實現這一功能。但是我找不到在Android中使用Overpass API的任何教程。我嘗試了一些東西,但我沒有得到它...所以我需要你的幫助,請給我一個例子或解釋如何實現這個:/立交橋Android示例?

這是我目前的代碼,但我不認爲這這是正確的..

URL url = new URL("http://overpass-api.de/api/interpreter"); 
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
urlConnection.setRequestMethod("GET"); 
urlConnection.setDoOutput(true); 
urlConnection.connect(); 
InputStream inputStream = urlConnection.getInputStream(); 
inputStream.close(); 

以下異常將在InputStream inputStream = urlConnection.getInputStream();拋出:

W/System.err的(3958):java.io.FileNotFoundException:http://overpass-api.de/api/interpreter W/System.err的(3958) :在libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) W/System.err(3958):at de.htw.berlin.games.based.location.gui.MapActivity $ test.doInBackground(MapActivity.java:536) W/System.err(3958):at de。 htw.berlin.games.based.location.gui.MapActivity $ test.doInBackground(MapActivity.java:1) W/System.err(3958):at android.os.AsyncTask $ 2.call(AsyncTask.java:287) (3958):在java.util.concurrent.FutureTask.run(java.lang.Confurrent.FutureTask.Run())中的System.err(3958):System.err(3958):java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305) (3958):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230) W/System.err(3958):在java.util.concurrent .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err(3958):在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:5 69) W/System.err的(3958):在java.lang.Thread.run(Thread.java:856)

感謝所有幫助的答覆:)

回答

3

此異常你要拋出因爲對http://overpass-api.de/api/interpreter的HTTP GET調用返回400 Bad Request響應。

你想要做的是POST請求http://overpass-api.de/api/interpreter。的form-dataAn example通過這個API是:

data='<?xml version="1.0" encoding="UTF-8"?><osm-script><!-- 
This is an example Overpass query. 
Try it out by pressing the Run button above! 
You can find more examples with the Load tool. 
--> 
<query type="node"> 
    <has-kv k="amenity" v="drinking_water"/> 
    <bbox-query s="41.88659196260802" w="12.488558292388916" n="41.89248629819397" e="12.51119613647461"/><!--this is auto-completed with the 
        current map view coordinates.--> 
</query> 
<print/></osm-script>' 

要找出API是如何工作的,你應該檢查,使用瀏覽器,什麼HTTP查詢在example I pointed outRun,當點擊該API的。

編輯

你可以找到很多像this one例子,說明如何在發佈的Android使用HTTP數據。你必須添加data關鍵和XML查詢字符串,作爲使用值對容器,如:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
nameValuePairs.add(new BasicNameValuePair("data", _The_XML_Query_String_)); 

堅持到linked example的休息,你HOULD是精細。

+0

你好,並感謝您的答案。請你能給我一個Android的例子如何使用Overpass API嗎?提前致謝。 – dsTny

+0

我編輯了我的回覆。 –

+0

非常感謝! – dsTny

1

結帳https://github.com/zsoltk/overpasser。這是一個Java庫,可以輕鬆處理Overpass API。

  1. 你不必寫QL字符串自己
  2. 它配備了一個改造適配器(這樣你就可以跳過網絡部分)
  3. 它展示瞭如何把它們放在一起一個Android樣本在谷歌地圖,讓你在任何時候開始