Пример Overpass API для Android?

для учебы мы должны разработать игру для Android, основанную на местоположении. В настоящее время мы используем OSMDroid для отображения карты. Есть ресурсы (например, дерево, камень и т. д.), которые игрок должен собирать. Эти ресурсы в настоящее время хранятся в нашем бэкэнде с жестко заданными параметрами long/lat и будут добавлены с помощью setMarker на текущую карту. Чтобы предоставить эту игру глобально, мы хотим динамически устанавливать ресурсы на основе «реального» мира. Поэтому нам нужны разные слои из OSM (например, лес, море и т. д.), чтобы автоматически устанавливать наши ресурсы, не запрашивая у нашего бэкэнда. После нескольких часов поиска в Google я обнаружил, что Overpass API, похоже, помогает мне реализовать эту функциональность. Но я не могу найти учебник по использованию 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): в de.htw.berlin.games .based.location.gui.MapActivity$test.doInBackground(MapActivity.java:536) W/System.err(3958): в 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): в java.util.concurrent.FutureTask$Sync. innerRun(FutureTask.java:305) W/System.err(3958): в 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): в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) W/System.err(3958): в java.util .concu rrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) W/System.err(3958): в java.lang.Thread.run(Thread.java:856)

Спасибо за все полезные ответы :)


person dsTny    schedule 30.03.2013    source источник


Ответы (2)


Это исключение, которое вы получаете, вызвано тем, что вызов HTTP GET для http://overpass-api.de/api/interpreter возвращает ответ 400 Bad Request.

То, что вы хотите сделать, это POST-запрос к http://overpass-api.de/api/interpreter. Пример form-data для передачи в этот 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-запрос делается к API при нажатии на Run в пример, который я указал.

ИЗМЕНИТЬ

Вы можете найти множество примеров, таких как этот, который показывает, как отправлять данные с помощью HTTP в Андроид. Вам нужно будет добавить data в качестве ключа и строку запроса XML в качестве значения в контейнере пары используемых значений, например:

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

В остальном придерживайтесь связанного примера, и все будет в порядке.

person Halim Qarroum    schedule 30.03.2013
comment
Здравствуйте и спасибо за ваш ответ. Пожалуйста, не могли бы вы привести пример в Android, как использовать Overpass API? Заранее спасибо. - person dsTny; 30.03.2013

Посетите https://github.com/zsoltk/overpasser. Это библиотека Java, упрощающая работу с Overpass API.

  1. Вам не нужно писать строку QL самостоятельно
  2. Он поставляется с адаптером Retrofit (так что вы можете пропустить сетевую часть)
  3. В нем есть образец Android, показывающий, как собрать их все вместе на Картах Google, чтобы вы могли начать работу в кратчайшие сроки.
person zsolt.kocsi    schedule 06.12.2015