Overpass API Android示例?

时间:2013-03-30 14:06:09

标签: android osmdroid openstreetmap

学习我们必须开发一款基于位置的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)

感谢所有有用的回复:)

2 个答案:

答案 0 :(得分:4)

结帐https://github.com/zsoltk/overpasser。它是一个简化使用Overpass API的Java库。

  1. 您不必自己编写QL字符串
  2. 它带有一个改装适配器(所以你可以跳过网络部分)
  3. 它有一个Android示例,展示了如何将它们全部放在Google地图上,以便立即开始使用

答案 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其他人,你应该没事。