RU:Overpass API

From OpenStreetMap Wiki
Jump to navigation Jump to search
Overpass API logo.svg
edit
Overpass API · Language reference · Language guide · Technical terms · Areas · Query examples · Sparse Editing · Permanent ID · FAQ · больше (русский) · Web site
Servers status · Versions · Development · Technical design · Installation · XAPI compatibility layer · Public transport sketch lines · Приложения · Source code and issues
Overpass turbo · Wizard · Overpass turbo shortcuts · MapCSS stylesheets · Export to GeoJSON · больше (русский) · Development · Source code and issues · Web site
Overpass Ultra · Overpass Ultra extensions · MapLibre stylesheets ·больше (русский) · Source code and issues · Web site
Overpass API logo.svg

Введение

Overpass API (или OSM3S) это доступный только для чтения API, который позволяет извлекать выборочные данные из базы OSM по пользовательскому запросу. Он выступает в качестве базы данных через Интернет: клиент посылает запрос к API и получает обратно набор данных, который соответствует запросу.

В отличие от основного API, который оптимизирован для редактирования, Overpass API оптимизирован для разного уровня потребителей данных - от извлечения всего нескольких элементов из базы за пару секунд или же до примерно 100 млн элементов за несколько минут,которые выбираются в соответствии с критериями поиска как, например, расположение, тип объектов, свойства тегов, близость или их комбинации. Он действует в качестве базы данных Back-end для различных сервисов.

Overpass API имеет мощный язык запросов (руководство по языку, справочник по языку, IDE) за пределами XAPI, но также имеет слой совместимости, позволяющий производить плавный переход от XAPI.

Для поддержки разного уровня сложности основных сервисов OSM, Overpass API работает как third party сервис. Вы можете использовать публичные серверы:

Сервера имеют общую пропускную способность около 1.000.000 запросов в день. Вы можете быть уверены, что не беспокоите других пользователей, если выполняете менее 10.000 запросов в день или скачиваете менее 5 ГБ данных в день.

Запросы к Overpass API могут быть в XML или Overpass QL форме. Смотрите пояснения семантики ниже.

Вы можете использовать интерфейс Overpass turbo для создания и отображения запросов Overpass API.

Overpass API также предоставляет постоянные ссылки.

Сообщество: где я могу получить помощь?

Есть несколько сайтов сообщества, обеспечивающих помощь по связанным с Overpass API и overpass turbo вопросам. Это рекомендуемые каналы для вопросов на уровне от новичка до эксперта или более общих, если ваш вопрос интересен для широкой аудитории.

Сайт Язык Часто используемые 'теги' для вопросов
Help OSM Английский overpass, overpass-turbo
GIS StackExchange Английский overpass-api
Stack Overflow Английский overpass-api


Разработчики / Системные администраторы

Вы можете создать свой собственный сервер на основе последней стабильной версии или из репозитория исходного кода git (последняя версия). Распространяется под лицензией Affero GPL v3.

Проект ведёт Roland Olbricht (почта: roland.olbricht@gmx.de). Сообщения об ошибках или запросы в исходный код приветствуются.

Есть также список рассылки для разработчиков.

Ограничения

Любой сервис имеет свои ограничения и Overpass API не исключение:

  • Скачивание больших объёмов данных:

Размер результата запроса Overpass API станет известен только когда загрузка будет завершена. Поэтому невозможно рассчитать ожидаемое время завершения загрузки. Также создание и загрузка динамически генерируемых файлов из Overpass API обычно занимает больше времени, чем загрузка существующих статических выдержек из той же области. Поэтому когда вы хотите извлечь регион размером со страну со всеми (или почти со всеми) в нём данными, лучше использовать planet.osm для этого. Overpass API наиболее полезен тогда, когда требуется определённая выборка данных, имеющихся в регионе.

  • Запросы истории данных OSM:

Overpass API не предоставляет критерии, основанные на пакете правок. Это возможно обойти использованием основанных на времени diffs, но это может быть неуклюжим. Overpass API также не может дать вам полную историю объекта, но основанные на времени критерии отбора могут дать вам состояние объекта в определённый момент времени.

Запрос карты

Прежде чем перейти к подробному описанию синтаксиса, мы представим, вероятно, наиболее распространенный случай использования, запрос карты, который позволяет собрать все данные из заданной ограничительной рамки:

  (node(51.249,7.148,51.251,7.152);<;);out;

Запустить этот запрос вы можете поместив его в эту форму запроса или использовав Overpass Turbo, чтобы увидеть результаты на карте.

Порядок значений в ограничительной рамке (51.249,7.148,51.251,7.152) следующий: минимальная широта, минимальная долгота, максимальная широта, максимальная долгота или Юго-Запад-Север-Восток. Смотрите более подробную информацию о bbox ниже.

Простые примеры использования

Раздел переехал в руководство по языку.

Сложные примеры использования

Следующие примеры знакомят с оставшимися командами recurse и around. Они имеют смысл только в сочетании с другими командами.

Опять же, все из последующих примеров могут быть проверены путем копирования фрагментов в http://www.overpass-api.de/query_form.html.

Примечание: Выполнение запросов может занять несколько минут. Если время ожидания истекло, то вы можете продлить срок ожидания.

Recurse

С командой recurse вы запрашиваете связь элементов. Для линии это будет запрос всех точек, входящих в неё, для отношения - запрос всех участников (точек и/или линий). А также наоборот, для точки, линии или отношения это будет запрос объекта, участником которого они являются. Вы выбираете тип элемента с помощью атрибута type.

Пример: Получить точки всех отношений, имеющих ключ ref со значением CE 61. На самом деле, получить все автобусные остановки, обслуживаемые CE 61.

<query type="relation">
  <has-kv k="ref" v="CE 61"/>
</query>
<recurse type="relation-node"/>
<print/>

Получить линии всех отношений, имеющих ключ ref со значением CE 61. На самом деле, это маршрут, обслуживаемый CE 61.

<query type="relation">
  <has-kv k="ref" v="CE 61"/>
</query>
<recurse type="relation-way"/>
<print/>

Получить точки вышеупомянутых линий. Вы не получите автобусные остановки, но это намеренно - смотрите ниже в примерах union.

<query type="relation">
  <has-kv k="ref" v="CE 61"/>
</query>
<recurse type="relation-way"/>
<recurse type="way-node"/>
<print/>

Получить все отношения, в участниках которых есть точки с именем Lichtscheid. Это автобусные маршруты с остановками там.

<query type="node">
  <has-kv k="name" v="Lichtscheid"/>
</query>
<recurse type="node-relation"/>
<print/>

Получить все линии, точки которых попадают в заданную ограничительную рамку.

<bbox-query s="51.249" n="51.251" w="7.149" e="7.151"/>
<recurse type="node-way"/>
<print/>

И также мы можем получить отношения, в участниках которых есть отношения:

<query type="relation">
  <has-kv k="name" v="VRR Buslinien"/>
</query>
<recurse type="relation-relation"/>
<print/>

Или то же самое в обратном направлении:

<query type="relation">
  <has-kv k="ref" v="CE 65"/>
</query>
<recurse type="relation-backwards"/>
<print/>

Around

Around позволяет получить все точки около одной или более заданных точек. Для примера получим все точки, которые находятся в радиусе 10 метров вокруг точек с именем "Bristol":

попробуйте сами в overpass-turbo
<query type="node">
  <has-kv k="name" v="Bristol"/>
</query>
<around radius="10"/>
<print/>

Вы также можете связывать запросы, чтобы получить только точки, удовлетворяющие второму критерию, которые находятся вблизи точек, соответствующих первому критерию. Здесь мы будем искать все автобусные остановки в пределах 100 метров от пабов с именем "Bristol":

попробуйте сами в overpass-turbo
<query type="node">
  <has-kv k="amenity" v="pub"/>
  <has-kv k="name" v="Bristol"/>
</query>
<query type="node">
  <around radius="100"/>
  <has-kv k="highway" v="bus_stop"/>
</query>
<print/>

Построение блоков

У нас ещё есть некоторые вспомогательные инструкции, в частности, union, item, the variable mechanism, osm-script и foreach.

Опять же, все из последующих примеров могут быть проверены путем копирования фрагментов в http://www.overpass-api.de/query_form.html.

Union

Union позволяет объединять результаты нескольких запросов. Например, вы можете получить все точки с именем Lichtscheid или Müngstener Straße.

<union>
  <query type="node">
    <has-kv k="name" v="Lichtscheid"/>
  </query>
  <query type="node">
    <has-kv k="name" v="Müngstener Straße"/>
  </query>
</union>
<print/>

Другой пример использования: получить отношение со всеми его участниками, включая точки участников-линий.

<union>
  <query type="relation">
    <has-kv k="ref" v="CE 61"/>
  </query>
  <recurse type="relation-node" into="nodes"/>
  <recurse type="relation-way"/>
  <recurse type="way-node"/>
</union>
<print/>

Это нуждается в объяснении:

  • query собирает все отношения с ref CE 61 и записывает результат в переменную _. А охватывающий union собирает эти данные.
  • recurse relation-node собирает точки, являющиеся участниками выше найденных отношений. Результат помещается в переменную nodes (здесь нам это больше не нужно, только чтобы сохранить отношения в переменной по умолчанию). И также эти данные забирает охватывающий union.
  • recurse relation-way смотрит снова на отношения из переменной по умолчанию, и возвращает линии, которые являются членами этих отношений. И снова, охватывающий union собирает результаты.
  • recurse way-node, наконец, возвращает точки, входящие в только что полученные линии. Этот последний кусок данных идёт в результат union.

Если вы думаете, что это сложно, вы правы. Я открыт для предложений как улучшить семантику инструкций, но я не придумал ещё ничего более систематичного.

Теперь мы готовы собрать наш запрос путём объединения bbox-query с несколькими recurse инструкциями и заключая всё это в union.

Item

Частично назначение item и переменных вы уже видели в предыдущем примере: каждая инструкция получает входные данные из переменной и выводит их в переменную. Если вы не укажете имя переменной, то значение по умолчанию будет _. Это даёт возможность убрать почти все явные спецификации переменных. Входные данные всегда извлекаются из переменной, именуемой атрибутом from, выходные данные всегда выводятся в переменную, указанную с into.

<query type="way" into="foo">
  <has-kv k="name" v="Am Hofe"/>
</query>
<print from="foo"/>

Например, здесь делается тоже самое, что и в соответствующем примере с print, но используется явно указанная переменная foo.

Чтобы сделать данную идею полностью универсальной, item позволяет вам указать набор как входные данные в union и query:

<query type="relation">
  <has-kv k="network" v="VRR"/>
  <has-kv k="ref" v="645"/>
</query>
<recurse type="relation-node" into="stops"/>
<query type="node">
  <around from="stops" radius="100"/>
  <has-kv k="highway" v="bus_stop"/>
</query>
<union>
  <item/>
  <recurse type="node-relation"/>
  <query type="node">
    <around from="stops" radius="100"/>
    <has-kv k="park_ride"/>
  </query>
</union>
<print/>

Здесь, в середине, item гарантирует, что заранее собранные данные для bus_stop включены в результаты union. Здесь также видно как необходима переменная stops, чтобы запрос был выполнимым.

<bbox-query s="51.15" n="51.35" w="7.0" e="7.3"/>
<recurse type="node-way"/>
<query type="way">
  <item/>
  <has-kv k="highway" v="motorway"/>
</query>
<print/>

item в запросе ограничивает вероятно найденные объекты до тех, которые уже найдены на предыдущем шаге с recurse. Таким образом, мы имеем завершённый запрос для поиска линий с произвольными тегами внутри bbox.

Osm-Script

osm-script добавляется по умолчанию, если вы не укажете иное. Добавлять его специально требуется когда нужно настроить управление ресурсами:

<osm-script timeout="900" element-limit="1073741824">

<bbox-query s="51.15" n="51.35" w="7.0" e="7.3"/>
<print/>
</osm-script>

Увеличено время ожидания с 3 до 15 минут (записывается как 900 секунд). Дополнительно, установлена квота на использование памяти в 1 GiB (равно 1073741824 байтам).

Foreach

<query type="relation">
  <has-kv k="type" v="multipolygon"/>
  <has-kv k="name"/>
</query>
<foreach into="pivot">
  <union>
    <recurse type="relation-way" from="pivot"/>
    <recurse type="way-node"/>
  </union>
  <make-area pivot="pivot"/>
</foreach>

Эта инструкция является неотъемлемой частью правила, что создает полигоны. Мы не будем объяснять make-area здесь. Первая часть с query собирает все отношения с определенными свойствами. Во второй части, мы хотим сделать что-то с каждым элементом в результате query. Это делает foreach. Инструкция выполняется один раз для каждого элемента в наборе данных ввода, помещает именно этот единственный элемент в набор данных вывода, здесь названный как pivot.

Meta data

Кроме специального режима print есть две инструкции, посвященные запросу специфических метаданных, user и newer.

User

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

<user name="Roland Olbricht"/>
<print mode="meta"/>

Или выберите id пользователя:

<user uid="65282"/>
<print mode="meta"/>

Эта инструкция также может быть использована внутри query инструкции. Она ограничивает результирующие данные только выводом данных, которые были в прошлом затронуты указанным пользователем:

<query type="node">
  <user name="Roland Olbricht"/>
  <has-kv k="highway" v="bus_stop"/>
  <bbox-query s="51.2" n="51.35" w="7.05" e="7.3"/>
</query>
<print mode="meta"/>

Newer

Newer инструкция может быть использована только внутри query инструкции. Она ограничивает выходные данные только элементам, которые созданы позже, чем в указанной дате. Дата должна быть в формате YYYY-MM-DDTHH:MM:SSZ. Это относится, как и результаты, всегда в часовому поясу UTC.

<query type="node">
  <newer than="2011-08-01T00:00:00Z"/>
  <has-kv k="highway" v="bus_stop"/>
  <bbox-query s="51.2" n="51.35" w="7.05" e="7.3"/>
</query>
<print mode="meta"/>

Если вы хотите получить все точки, созданные позже, чем в указанной дате из bbox, вы можете использовать query с подинструкцией item.

<bbox-query s="51.2" n="51.35" w="7.05" e="7.3"/>
<query type="node">
  <item/>
  <newer than="2011-08-01T00:00:00Z"/>
</query>
<print mode="meta"/>

Пример общественного транспорта

Интересный пример того, как Overpass API может быть интегрирован в приложение - сервис создания линейных диаграмм для общественного транспорта.

Предпросмотр примера 1


Предпросмотр примера 2


Другие примеры

(Пожалуйста, будьте терпеливы - каждый запрос может занять до 10 секунд для создания, в зависимости от нагрузки на сервер.)

Слой совместимости XAPI

Подробности и примеры смотрите:

Программы/Скрипты около Overpass

Python API

Node.js API

  • query-overpass - это простой API wrapper и CLI для Overpass.

Преобразователи

Обсуждения, презентации, семинары

В этом разделе перечислены предыдущие презентации, обсуждения, семинары по Overpass API и смежным темам. Многие презентации являются хорошим началом даже для начинающих с большим количеством примеров.

Дата Событие Местоположение Название Формат Докладчик Язык Ссылки
Июль 2015 AGIT 2015 Salzburg (AT) Overpass API: OpenStreetMap-Daten vorgefiltert beziehen Презентация Roland Olbricht Немецкий ?
Июнь 2015 SotM US 2015 NYC (US) Working with OSM diffs / The Overpass API Семинар Roland Olbricht Английский ?, Abstract
Апрель 2015 geo-spatial.org Cluj (RO) Overpass API: utilizarea datelor OpenStreetMap pentru a realiza hărți tematice Семинар Alex Morega Румынский Workshop materials
Март 2015 FOSSGIS 2015 Münster (DE) Schatzsuche in OpenStreetMap Презентация Roland Olbricht Немецкий Abstract, Video
Март 2015 FOSSGIS 2015 Münster (DE) OpenStreetMap-Daten pflegen und finden mit der Overpass API Семинар (платный) Roland Olbricht Немецкий no material available
Февраль 2015 FOSDEM 2015 Bruxelles (BE) Overpass-API - A service to query OpenStreetMap data Презентация Roland Olbricht Английский Slides, Video
Сентябрь 2014 Bonn (DE) Overpass-API Seminar bei ZERA Семинар Roland Olbricht Немецкий Manuscript, Slides
Июнь 2014 SotM-EU 2014 Karlsruhe (DE) Overpass API v0.7.50 - The temporal dimension Презентация Roland Olbricht Английский Slides/Video
Июнь 2014 SotM-EU 2014 Karlsruhe (DE) Sparse Editing - Editing Large-Scale Objects Презентация Roland Olbricht Английский Slides/Video
Апрель 2014 Grazer Linuxtage 2014 Graz (AT) OpenStreetMap Daten nutzen Презентация Martin Raifer Немецкий Slides
Март 2014 FOSSGIS 2014 Berlin (DE) Daten aus OpenStreetMap extrahieren, analysieren und filtern mit der Overpass API Семинар (платный) Roland Olbricht Немецкий no material available
Октябрь 2013 Intergeo 2013 Essen (DE) OSM-Daten direkt nutzen mit der Overpass API Презентация Roland Olbricht Немецкий Slides
Октябрь 2013 OSMit 2013 Rovereto (IT) Overpass Turbo Презентация Martin Raifer Итальянский Slides
Март 2013 FOSSGIS 2013 Rapperswil (CH) Daten aus OpenStreetMap extrahieren, analysieren und filtern mit der Overpass API Семинар Roland Olbricht Немецкий Slides
Март 2013 FOSSGIS 2013 Rapperswil (CH) overpass turbo - Einfache Analyse von OpenStreetMap Daten Презентация Martin Raifer Немецкий Slides, Video, Tagungsband FOSSGIS 2013
Март 2013 FOSSGIS 2013 Rapperswil (CH) Mobile Karten erstellen mit OSM, OpenLayers und Overpass API Презентация Roland Olbricht Немецкий Slides, Video
Декабрь 2012 OSMDE009 OSM Talk: Die Overpass API Подкаст Roland Olbricht, Stephan/RadioOSM Немецкий Link
Март 2012 FOSSGIS 2012 Berlin (DE) Overpass API Презентация Roland Olbricht Немецкий Slides, Tagungsband FOSSGIS 2012
Июль 2011 SotM-EU 2011 Vienna (AT) Overpass API - an open and slim XAPI alternative Презентация Roland Olbricht Английский Slides, Video

Книги

Olbricht, Roland (2015). “OpenStreetMap in GIScience”. in Jokar Arsanjani, J.; Zipf, A.; Mooney, P. et al.. Springer International Publishing Switzerland. pp. 101-122. ISBN 978-3-319-14280-7.