学习我们必须开发一款基于位置的Android游戏。目前我们使用OSMDroid来显示地图。玩家必须收集资源(如木头,石头......)。这些资源当前存储在我们的后端,带有硬编码的long / lat,并将与setMarker一起添加到当前地图上。 为了在全球范围内提供此游戏,我们希望根据" real"动态设置资源。世界。所以我们需要来自OSM的不同层(如森林,海洋......)来自动设置我们的资源而不需要我们的后端。 用谷歌搜索几个小时后,我发现Overpass API似乎可以帮助我实现这个功能。但我无法找到在Android中使用Overpass API的任何教程。我尝试了一些东西,但我没有得到它......所以我需要你的帮助,请给我一个例子或解释如何实现这个:/
这是我目前的代码,但我不认为这是正确的..
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):at 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):在android.os.AsyncTask $ 2.call(AsyncTask.java:287) W / System.err(3958):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305) W / System.err(3958):at java.util.concurrent.FutureTask.run(FutureTask.java:137) W / System.err(3958):在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230) W / System.err(3958):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W / System.err(3958):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:569) W / System.err(3958):at java.lang.Thread.run(Thread.java:856)
感谢所有有用的回复:)
答案 0 :(得分:4)
结帐https://github.com/zsoltk/overpasser。它是一个简化使用Overpass API的Java库。
答案 1 :(得分:3)
由于对http://overpass-api.de/api/interpreter
的HTTP GET调用返回400 Bad Request
响应,因此会引发此异常。
您要做的是对http://overpass-api.de/api/interpreter
的POST请求。 form-data
传递给此API的An example是:
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的工作原理,您应该使用浏览器检查点击example I pointed out中的Run
时对API的HTTP查询。
修改强>
您可以找到大量示例,例如this one,其中显示了如何在Android中使用HTTP发布数据。您必须在使用的值对容器中将data
作为键和XML查询字符串添加为值,例如:
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("data", _The_XML_Query_String_));
坚持linked example其他人,你应该没事。