RU:Overpass API
Servers status · Versions · Development · Technical design · Installation · XAPI compatibility layer · Public transport sketch lines · Приложения · Source code and issuesOverpass turbo · Wizard · Overpass turbo shortcuts · MapCSS stylesheets · Export to GeoJSON · больше (русский) · Development · Source code and issues · Web siteOverpass Ultra · Examples · Overpass Ultra extensions · MapLibre stylesheets · URL Params · больше (русский) · Source code and issues · Web site
Введение
Overpass API (или OSM3S) это доступный только для чтения API, который позволяет извлекать выборочные данные из базы OSM по пользовательскому запросу. Он выступает в качестве базы данных через Интернет: клиент посылает запрос к API и получает обратно набор данных, который соответствует запросу.
В отличие от основного API, который оптимизирован для редактирования, Overpass API оптимизирован для разного уровня потребителей данных - от извлечения всего нескольких элементов из базы за пару секунд или же до примерно 100 млн элементов за несколько минут,которые выбираются в соответствии с критериями поиска как, например, расположение, тип объектов, свойства тегов, близость или их комбинации. Он действует в качестве базы данных Back-end для различных сервисов.
Overpass API имеет мощный язык запросов (руководство по языку, справочник по языку, IDE) за пределами XAPI, но также имеет слой совместимости, позволяющий производить плавный переход от XAPI.
Для поддержки разного уровня сложности основных сервисов OSM, Overpass API работает как third party сервис. Вы можете использовать публичные серверы:
- https://overpass-api.de/ с основным адресом для запросов https://overpass-api.de/api/interpreter (4 физических ядра, 32 GB RAM).
https://overpass.openstreetmap.ru/с основным адресом для запросов https://overpass.openstreetmap.ru/api/interpreter (8 ядер, 64 GB RAM).- https://maps.mail.ru/osm/tools/overpass/api/ - сервер поднятый mail.ru/vk_maps (2 servers with 56 physical cores, 384Gb RAM, SSD)
- https://overpass.openstreetmap.fr/ с основным адресом для запросов https://overpass.openstreetmap.fr/api/interpreter (8 ядер, 16 GB RAM, no Attic data).
Сервера имеют общую пропускную способность около 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":
<query type="node">
<has-kv k="name" v="Bristol"/>
</query>
<around radius="10"/>
<print/>
Вы также можете связывать запросы, чтобы получить только точки, удовлетворяющие второму критерию, которые находятся вблизи точек, соответствующих первому критерию. Здесь мы будем искать все автобусные остановки в пределах 100 метров от пабов с именем "Bristol":
<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 API/XAPI
- конструктор запросов Overpass XAPI на harrywood.co.uk
Программы/Скрипты около Overpass
Python API
- Простой Python wrapper, написанный Martijn van Exel (talk).
- Продвинутый Python wrapper под названием OverPy.
Node.js API
- query-overpass - это простой API wrapper и CLI для Overpass.
Преобразователи
- В GPX - исходный код osm2node и онлайн-сервис.
- API 0.6 wrapper - исходный код и онлайн-сервис.
- osmtogeojson преобразует данные OSM в GeoJSON и имеет полную поддержку режимов расширенного вывода геометрии Overpass API.
Обсуждения, презентации, семинары
В этом разделе перечислены предыдущие презентации, обсуждения, семинары по 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.