RU:Overpass API/Language Guide

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. Изменяйте эти запросы для собственных задач.

Идея и принцип работы

Overpass API позволяет делать запросы в базу данных OSM по вашим собственным критериям. Специально для этого был создан язык для запросов (query language).

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

node(50.745,7.17,50.75,7.18);out;

Далее можно отфильтровать результат, чтобы найти только автобусные остановки:

node(50.745,7.17,50.75,7.18)[highway=bus_stop];out;

Также вы можете расширить результат, включив линии, использующие выбранные точки. В этом случае вам, возможно, захочется включить в результат и все точки, к которым относятся линии:

node(50.745,7.17,50.75,7.18);way(bn);(._;>;);out;

Операторы в примерах и их синтаксис будут описаны подробнее ниже.

Языки

Overpass API теперь предоставляет всю свою мощь через единтсвенный запрос HTTP GET. Для этого был введён новый язык для запросов Overpass QL параллельно установленному XML query language. Вы можете конвертировать запросы между языками: просто вставьте один из примеров ниже сюда: http://overpass-api.de/convert_form.html. Здесь можно выбрать в каком виде вывести:

  • XML запрос: подобные запросы во всех Оverpass XML формах внизу.
  • обычный Overpass QL: подобные запросы во всех Overpass QL формах внизу.
  • сжатый Overpass QL: на выходе получается однострочный HTTP GET запрос для исходного выражения.

Для выполнения запроса используйте http://overpass-api.de/query_form.html.

Примеры синтаксиса QL приведены ниже. Он лаконичнее, и это делает его похожим на C-образные языки программирования. Оператор всегда заканчивается точкой с запятой ";". Более того, оператор является либо:

  • оператором запроса, начинающимся с "node", "way", "relation", "rel" (сокращённо от "relation" - отношение), или одним из специальных символов ">", ">>", "<", или "<<", либо
  • оператором вывода, начинающимся на "out".

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

Все варианты запроса тегов; в т.ч.,

  ["key"="value"]
  ["key"]
  ["key"~"value"]
  ["key"!="value"]
  ["key"!~"value"]

Или условия определяющие границы рамки

  (51.0,7.0,52.0,8.0)

Условия для ограничивающей рамки (bounding box) всегда начинаются с меньшей широты, затем идёт меньшая долгота, далее большая широта и, наконец, большая долгота. Заметьте, что в синтаксисе XAPI порядок отличается. А в XML используются именованные параметры.

Or recursion forward or backward about membership links

  (r)
  (w)
  (n)
  (br)
  (bw)
  (bn)
  (>)
  (>>)
  (<)
  (<<)

Или специальные условия формы "(type:value)".

Болше деталей в соответсвующем разделе Примеров Использования.

О ссылках

Большинство примеров отображаются ссылками на карте. Это всё ещё очень экспериментальное решение. Ограничивающая рамка в примерах зафиксирована показывать германский город Бонн(?). Некоторые запросы могут занять довольно много времени, возможно, больше минуты, если нужных данных нет в кэше на сервере. The symbols are ugly, but this could also be changed for a mashup layer aiming at end users. They should be primarily easy to find.

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

Везде где увидите этот символ: overpass turbo icon, можете нажать на него, чтобы использовать overpass turbo для проверки примера запроса и увидеть его результат.

Найти что-либо

Найти что-то в данных OpenStreetMap всегда значит определить месторасположение или значения определённых тегов. Можете выбирать любые теги в примерах ниже. Сначала найдём объекты по имени, для этого будем искать определённые значения тега "name".

По точному имени

В нашем первом примере будем искать точку по значению тега имени:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node["name"="Gielgen"];
out body;

Отобразить результат: OpenLayers map, JSON, XML.

По точному имени и примерному расположению

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

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"="Gielgen"]
  (50.7,7.1,50.8,7.2);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Что-либо возле чего-то ещё

Менее техничный способ получить один из множества результатов - искать что-либо вокруг определённого места. Например, искать объект с именем "Gielgen" в радиусе 1000 метров от объекта с именем "Bonn".

(Будьте внимательны, некоторые вычисления используют несфероидные формулы (узнать больше здесь), что может вызвать погрешности)

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Bonn"/>
  </query>
  <query type="node">
    <around radius="1000"/>
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node["name"="Bonn"];
node
  (around:1000)
  ["name"="Gielgen"];
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Неточные названия

Найти нужный объект можно даже если вы не знаете его точное имя. Для этого в Overpass API есть поддержка (включая POSIX) регулярных выражений. Вот пара примеров полезных регулярных выражений.

Первый ищет любые точки, содержащие в названии подстроку "holtorf" :

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="holtorf"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"holtorf"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Второй пример ищет любые точки, у которых название начинается с "Holtorf":

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="^Holtorf"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"^Holtorf"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Третий пример ищет любые точки, содержащие "holtorf" в конце имени:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="Holtorf$"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"holtorf$"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Можно, конечно использовать и "^Holtorf$", но в этом случае проще искать по точному значению.

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

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="[hH]oltorf"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"[hH]oltorf"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Ударения и видоизменённые символы

Множество европейских языков используют изменённые варианты общеизвестных латинских символов, не только "e" но и "é" или "ê". Можно включить их в запрос с помощью регулярных выражений:

Перечислив все варианты символа:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="H[oôóòö]ltorf" />
    <bbox-query s="50.7" w="7.1" n="50.8" e="7.25" />
  </query>
  <print />
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"H[oôóòö]ltorf"]
  (50.7,7.1,50.8,7.25);

out body;

Или поставив точку-джокер(wildcard) (которая означат любой символ):

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="H.ltorf" />
    <bbox-query s="50.7" w="7.1" n="50.8" e="7.25" />
  </query>
  <print />
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"H.ltorf"]
  (50.7,7.1,50.8,7.25);

out body;

Обратите внимание:

  • Точка-джокер(wildcard) заменяет одну кодовую точку UTF-8 , но необязательно один байт в этом кодировании (только символы в 7-битном US-ASCII поднаборе закодированы в UTF-8 в один байт). То есть, точка может заменить "e" как и "é" или "ê" (и любые другие буквы, включая нелатинские; "-" или пробел), но не "ø̄" которая кодируется не как одна кодовая точка, а как предварительно скомпонованная перечёркнутая буква o объединённая с макроном, или как предварительно скомпонованная буква o с макроном с наложением перечёркивающей линии, или как базовая буква o объединённая в любом порядке с макроном и перечёркивающей линией).
  • Буквы, объединённые с диакритическими знаками хранятся в базе Юникода “Normalized Form Composed”, или NFC. Большинство букв с диакритиками, используемых в современных европейских языках, компонуются в NFC, но не каждая пара, состоящая из базовой буквы, объединённой с одним диакритиком, будет скомпонована в одну кодовую точку, в то же время, есть некоторые буквы, объединённые с двумя диакритиками, которые котируются в NFC как одна кодовая точка, такая как "ế", используемая во Вьетнаме, и эту букву может заменить одна точка-джокер, в отличие от канонического эквивалента - базовая буква "e" объединённая с отдельными диакритиками в любой последовательности (одна из этих последовательностей - “Normalized Form Decomposed” (NFD), используемая в некоторых ОС, таких как MacOS (в своей файловой системе предпочитает хранить имена файлов закодированными именно как NFD), или некоторыми клавиатурными драйверами или текстовыми редакторами.
  • По этой причине не так-то просто покрыть все формы кодирования базовой буквы e (включая регистр) с одним или больше диакритическим знаком или без него: Overpass API всё ещё не поддерживает регулярные выражения основанные на сопоставлении (чьи правила зависят от используемого языка и скрипта, от используемого подборщика(collator) для этого языка и скрипта и от параметров сравнения (чувствительность к регистру, например). Вместо этого лучше перечислять все ожидаемые варианты символа в [квадратных] скобках, или использовать сложные запросы для каждого правила орфографии или кодирования искомого символа.

Альтернативные значения

Для поиска альтернативных значений используйте вертикальную черту.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" regv="holtorf|Gielgen"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"~"holtorf|Gielgen"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Больше информации о регулярных выражениях (расширенных POSIX) можно найти в любом поисковике по запросу "man 7 regex".

Отрицания

Регулярные выражения сами по себе не допускают отрицаний. По этой причине в Overpass QL существует оператор отрицания.

Например, следующий запрос даёт все линии, у которых отсутствует ключ highway:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="way">
    <has-kv k="highway" modv="not" regv="."/>
    <bbox-query e="7.18" n="50.75" s="50.74" w="7.17"/>
  </query>
  <print limit="" mode="body" order="id"/>
</osm-script>
попробуйте сами в overpass-turbo
way
  ["highway"!~"."]
  (50.74,7.17,50.75,7.18);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Во втором примере вы можете ограничить запрос для автобусных остановок до тех, у которых есть навес. Технически, мы ищем точки с "highway"="bus_stop" и тегом "shelter" со значением, отличным от "no".

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="highway" v="bus_stop"/>
    <has-kv k="shelter"/>
    <has-kv k="shelter" modv="not" v="no"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["highway"="bus_stop"]
  ["shelter"]
  ["shelter"!="no"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

То же самое с регулярными выражениями:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="highway" v="bus_stop"/>
    <has-kv k="shelter"/>
    <has-kv k="shelter" modv="not" regv="no"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["highway"="bus_stop"]
  ["shelter"]
  ["shelter"!~"no"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Множество тегов

Конечно же, можно искать точки, имеющие тег "highway" со значением "bus_stop" и тег "shelter" со значением "yes":

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="highway" v="bus_stop"/>
    <has-kv k="shelter" v="yes"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["highway"="bus_stop"]
  ["shelter"="yes"]
  (50.7,7.1,50.8,7.25);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Улицы и другие линии

Все вышеприведённые запросы работают как для линий, так и для отношений. Найдём улицу "Gielgenstraße" внутри уже знакомой ограничительной рамки:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="way">
    <has-kv k="name" v="Gielgenstraße"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
way
  ["name"="Gielgenstraße"]
  (50.7,7.1,50.8,7.25);
out;

Отобразить результат: OpenLayers map, JSON, XML.

Заметьте, для отображения линии на карте нужно также запросить точки этой линии (или если нужны координаты для других целей). Делается это с помощью extra-recurse down оператора. Для получения также и линии, поместим оба в оператор union. Эти операторы будут описаны ниже.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="way">
    <has-kv k="name" v="Gielgenstraße"/>
    <bbox-query e="7.25" n="50.8" s="50.7" w="7.1"/>
  </query>
  <union>
    <item />
    <recurse type="way-node"/>
  </union>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
(
  way
    ["name"="Gielgenstraße"]
    (50.7,7.1,50.8,7.25);
  >;
);
out;

Отношения

А теперь мы будем искать отношение с "network"="VRS" и "ref"="636". Это пригородный автобус. Так как аббревиатура сети уникальна, нам не нужна ограничительная рамка и другие уточнения.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="relation">
    <has-kv k="network" v="VRS"/>
    <has-kv k="ref" v="636"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
relation
  ["network"="VRS"]
  ["ref"="636"];
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Все виды объектов

И, наконец, найдём все виды объектов с определённым тегом внутри ограничивающей рамки. Нужно будет указать тег для каждого вида и использовать оператор union. Для отображения всего этого на карте мы также запросим точки и линии, к которым обращаются полученные отношения и линии:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union>
    <query type="node">
      <has-kv k="amenity" v="fire_station"/>
      <bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
    </query>
    <query type="way">
      <has-kv k="amenity" modv="" v="fire_station"/>
      <bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
    </query>
    <query type="relation">
      <has-kv k="amenity" modv="" v="fire_station"/>
      <bbox-query e="7.3" n="50.8" s="50.6" w="7.0"/>
    </query>
  </union>
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node
    ["amenity"="fire_station"]
    (50.6,7.0,50.8,7.3);
  way
    ["amenity"="fire_station"]
    (50.6,7.0,50.8,7.3);
  rel
    ["amenity"="fire_station"]
    (50.6,7.0,50.8,7.3);
);
(._;>;);
out;

Отобразить результат: OpenLayers map JSON, XML.

Все данные внутри ограничительной рамки

Оператор bbox-query позволяет загрузить все точки, линии или отношения внутри рамки. Задайте:

  • s южную границу в десятичных градусах (меньшая широта, меряется вдоль меридиана от ближайшей точки Экватора, в Южном полушарии имеет отрицательные значения)
  • w западную границу в десятичных градусах (меньшая долгота, меряется вдоль пареллели от ближайшей точки Гринвичского меридиана, в Западном полушарии имеет отрицательные значения)
  • n северную границу в десятичных градусах (большая широта, меряется вдоль меридиана от ближайшей точки Экватора, в Северном полушарии имеет положительные значения)
  • e восточную границу в десятичных градусах (большая долгота, меряется вдоль параллели от ближайшей точки Гринвичского меридиана, в Восточном полушарии имеет положительные значения)

Координаты определяются в базе данных OSM и в OverPass API вертикальной проекцией реальных точек(real points) в узлы(nodes) на эллипсоиде WGS84.

Обратите внимание на то, что в Overpass QL неочевидный порядок координат (s, w, n, e). Overpass QL более сжатый, чем понятный синтаксис XML, но, конечно, требует внимания для написания координат в правильной последовательности. Западная граница может быть больше восточной только в том случае, когда ваш запрос пересекает долготу ±180.0 градусов, с ограничивающей рамкой, пересекающей Антимередиан (в этом случае запрос эквивалентен сумме запросов с ограничивающими рамками по обе стороны Антимередиана.

Точки

Все точки в пределах небольшой рамки:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node(50.746,7.154,50.748,7.157);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Линии

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

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="way">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
way(50.746,7.154,50.748,7.157);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Отношения

Отношение найдётся если внутри рамки есть точка или линия, участвующая в отношении.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="relation">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
relation(50.746,7.154,50.748,7.157);
out body;

Отобразить результат: OpenLayers map, JSON, XML.

Sample map calls

В большинстве случаев вам нужен будет полный комплект данных, чем просто элементы определённого типа. Однако, есть несколько различных трактовок того, что означает этот "полный комплект данных". Первый неясный момент - что делать с точками за пределами ограничительной рамки, которые принадлежат линиям, частично лежащим внутри рамки.

То же самое касается и отношений. Если вам нужен запрет поворота (turn restriction), то лучше будет включить всех участников отношения в результат. А если ограничивающая рамка коснётся, например, границы России, то вам, наверное, не очень захочется скачивать десятки тысяч километров границы вокруг половины Земного шара.

Второй вопрос - нужно ли включать отношения, содержащие отношения.

Для ответа на эти вопросы мы чуть позже приведём несколько вариантов запросов карты (map calls). Здесь парадигма запросов(querry paradigm) проявляет свою силу, позволяя составлять запрос на любой вкус. Просто выберите запрос из примеров и видоизменяйте для собственных нужд.

Некоторые части запросов будут подробно разобраны ниже в более продвинутых разделах.

Самый простой запрос карты

Этот запрос включает все точки в пределах рамки, все линии, содержащие эти точки и все отношения, содержащие эти точки или линии в качестве участников. Заметьте, что в Open Layers отображаются не все линии и отношения из-за того, что для Open Layers требуется загрузить все точки линии и всех участников отношения для их отображения.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union into="_">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    <recurse type="up"/>
  </union>
  <print mode="meta"/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  <;
);
out meta;

Отобразить результат: (Open Layers doesn't show), JSON, XML.

Оператор "<" определяет здесь все связанные с точками линии и отношения (обратное наследование). Этот процесс можно разбить по шагам в виде обратной рекурсии:

  • Для начала, достанем все отношения, связанные с только что найденными точками: rel(bn);
  • Затем получим все линии, связанные с найденными точками: way(bn);
  • Наконец, достанем все отношения, связанные с полученными линиями: rel(bw);

Для полноты картины rel(br); найдёт отношения, которые входят в другие отношения в качестве участников.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union into="_">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    <recurse into="x" type="node-relation"/>
    <recurse type="node-way"/>
    <recurse type="way-relation"/>
  </union>
  <print mode="meta"/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  rel(bn)->.x;
  way(bn);
  rel(bw);
);
out meta;

Отобразить результат: (Open Layers doesn't show), JSON, XML.

Полные линии, неполные отношения

Этот запрос включает все точки внутри рамки, все линии внутри рамки, все точки, принадлежащие этим линиям, независимо от их положения, внутри или снаружи, и все отношения, включающие эти точки и линии. В настоящий момент запрос way с ограничивающей рамкой иногда делает запрос медленным. Я работаю над этим, пока потерпите, пожалуйста. e moment. Заметьте, что в Open Layers отображаются не все линии и отношения из-за того, что для Open Layers требуется загрузить все точки линии и всех участников отношения для их отображения.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union into="_">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    <recurse into="x" type="node-relation"/>
    <query type="way">
      <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    </query>
    <recurse into="x" type="way-node"/>
    <recurse type="way-relation"/>
  </union>
  <print mode="meta"/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  rel(bn)->.x;
  way(50.746,7.154,50.748,7.157);
  node(w)->.x;
  rel(bw);
);
out meta;

Отобразить результат: OpenLayers map, JSON, XML.

Полные линии и отношения

Этот запрос включает все точки внутри рамки, все линии относящиеся к любой из этих точек, все точки, принадлежащие этим линиям (в т.ч. за пределами рамки), все отношения, включающие в себя любую из этих точек и линий, и все точки и линии, входящие в эти отношения, а также все точки линий - участников отношения. Имейте в виду, что в отношениях могут быть объекты далеко за пределами ограничительной рамки.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union into="_">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    <recurse type="up"/>
    <recurse type="down"/>
  </union>
  <print limit="" mode="meta" order="id"/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  <;
  >;
);
out meta;

Отобразить результат: OpenLayers map, JSON, XML.

"<" определяет обратное наследование, а ">" определяет прямое наследование. Другими словами, ">" собирает всех участников только что найденных отношений: все точки, линии и точки относящиеся к этим линиям. Опять же, это можно представить в виде блоков:

  • node(w) собирает точки только что найденных линий
  • node(r) делает то же самое для отношений
  • way(r) собирает линии, участвующие в найденных отношениях

Оператор rel(r) собирает отношения, участвующие в уже найденных отношениях (не вызывается в примере). Теперь, тот же самый запрос в пошаговом виде:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union into="_">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    <recurse into="x" type="node-relation"/>
    <recurse type="node-way"/>
    <recurse type="way-relation"/>
  </union>
  <union into="_">
    <item set="_"/>
    <recurse type="relation-way"/>
  </union>
  <union into="_">
    <item set="_"/>
    <recurse into="x" type="relation-node"/>
    <recurse type="way-node"/>
  </union>
  <print mode="meta"/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  rel(bn)->.x;
  way(bn);
  rel(bw);
);
(
  ._;
  way(r);
);
(
  ._;
  node(r)->.x;
  node(w);
);
out meta;

Отобразить результат: OpenLayers map, JSON, XML.

Отношения, включающие отношения

Этот запрос включает дополнительно все отношения отношений внутри рамки за 5 интераций. Их участники специально не включены в результат, так как это может оказаться значительной частью всех данных Германии; т.е. несколько сотен мегабайт данных. Note also that five levels of descent usually is more than enough to get all backlinks. If you doubt you have all backlinks, just add another rel(br); statement and see whether more data comes back.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <union into="_">
    <bbox-query e="7.157" n="50.748" s="50.746" w="7.154"/>
    <recurse into="x" type="node-relation"/>
    <recurse type="node-way"/>
    <recurse type="way-relation"/>
  </union>
  <union into="_">
    <item set="_"/>
    <recurse type="relation-way"/>
  </union>
  <union into="_">
    <item set="_"/>
    <recurse into="x" type="relation-node"/>
    <recurse type="way-node"/>
  </union>
  <union into="_">
    <item set="_"/>
    <recurse type="relation-backwards"/>
    <recurse type="relation-backwards"/>
    <recurse type="relation-backwards"/>
    <recurse type="relation-backwards"/>
  </union>
  <print mode="meta"/>
</osm-script>
попробуйте сами в overpass-turbo
(
  node(50.746,7.154,50.748,7.157);
  rel(bn)->.x;
  way(bn);
  rel(bw);
);
(
  ._;
  way(r);
);
(
  ._;
  node(r)->.x;
  node(w);
);
(
  ._;
  rel(br);
  rel(br);
  rel(br);
  rel(br);
);
out meta;

Отобразить результат: OpenLayers map, JSON, XML.

Выбрать область внутри полигона

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

попробуйте сами в overpass-turbo
(
  node(poly:"50.7 7.1 50.7 7.12 50.71 7.11");
  <;
);
out meta;

Отобразить результат: XML, JSON

В общем, примеры выше можно адаптировать для варианта с полигоном: Просто замените условие bbox на polygon. Единственное ограничение в том, что полигоны можно использовать в качестве границы только для точек. Используйте рекурсию, чтобы получить линии и отношения.

Если вы хотите использовать полигон как в выводе rel2poly.pl в качестве границы, можете конвертировать его следующим скриптом poly2request.sh:

#!/usr/bin/env bash

echo -n '(node(poly:"'
awk '{ if ($1 != "1" && $1 != "polygon" && $1 != "END") printf $2" "$1" "; }'
echo '");<;);out;'

Теперь можно загружать данные, например:

./poly2request.sh <polygon.txt >request.txt
wget --post-file=request.txt http://overpass-api.de/api/interpreter

Формат вывода

information sign

Эта статья является неполной. Вы можете помочь проекту OpenStreetMap, дополнив её.

Оператор Print выводит запрашиваемое содержимое и возвращаемые данные. Поэтому почти каждый запрос заканчивается им. Для краткости print было переименовано в out; в Overpass QL.

Уровень детальности

Print имеет 4 степени детальности, которые определяются атрибутом mode: body (по умолчанию), skeleton, ids_only, и meta. Различие между ними на примерах ниже. Чем проще вывод, тем быстрее запрос. Поэтому skeleton в этом руководстве используется для OpenLayers layers. meta, пожалуй, будет лучшим вариантом когда нужно редактировать данные. Если вы не уверены что использовать, попробуйте body для начала.

Обычный режим (body)

body - это режим по умолчанию: выводятся id, дочерние элементы и теги. При использовании данного режима атрибут mode можно опустить.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out;

Отобразить результат: OpenLayers map, JSON, XML.

Сокращённый режим (skeleton)

Режим skeleton: Теги не выводятся в этом режиме, только id, дочерние элементы, и координаты точек:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print mode="skeleton"/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out skel;

Отобразить результат: OpenLayers map, JSON, XML.

Краткий режим (ids_only)

ids_only - это самый короткий режим; Выводятся только id. ids_only сокращён до ids в Overpass QL. В Open Layers не работает, так как не возвращаются координаты.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print mode="ids_only"/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out ids;

Отобразить результат: OpenLayers map, JSON, XML.

Подробный режим (meta)

meta - это самы полный режим. Помимо дочерних элементов и тегов, выводятся также метаданные (отметка времени, версия, пакет правок, имя пользователя и id):

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print mode="meta"/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out meta;

Отобразить результат: OpenLayers map, JSON, XML.

В частности, эти мета данные необходимы для обработки результата в JOSM.

Атрибут порядка

Порядок элементов также можно изменять. По умолчанию элементы упорядочиваются по id (т.е., order="id"). Можно получить результат быстрее, если упорядочить элементы по местоположению (т.е., order="quadtile", или qt в Overpass QL).

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
    <has-kv k="place" v="suburb"/>
  </query>
  <print order="quadtile"/>
</osm-script>
попробуйте сами в overpass-turbo
node
  ["name"="Gielgen"]
  ["place"="suburb"];
out qt;

Отобразить результат: OpenLayers map, JSON, XML.

Атрибут предельного количества

Также возможно ограничить количество выводимых элементов:

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print limit="2"/>
</osm-script>
попробуйте сами в overpass-turbo
node["name"="Gielgen"];
out 2;

Отобразить результат: OpenLayers map, JSON, XML.

Это ограничит вывод до двух точек.

Атрибут геометрии

Добавляет центр ограничивающей рамки объекта, необязательно будет находится внутри объекта.

Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <query type="relation">
    <has-kv k="boundary" v="postal_code"/>
    <has-kv k="postal_code" v="65343"/>
  </query>
  <print geometry="center"/>
</osm-script>
попробуйте сами в overpass-turbo
rel["boundary"="postal_code"][postal_code=65343];
out center;

Выбор формата файла

Можно получить результат в JSON или XML. По умолчанию XML. Чтобы получить JSON, просто добавьте требование JSON в шапке запроса (до первого оператора):

Overpass XML Overpass QL
link=http://overpass-turbo.eu/?Q=%3Cosm-script%20output%3D%22json%22%3E%0A%20%20%3Cquery%20type%3D%22node%22%3E%0A%20%20%20%20%3Chas-kv%20k%3D%22name%22%20v%3D%22Gielgen%22%2F%3E%0A%20%20%3C%has-kv k="name" v="Gielgen"/> 2Fquery%3E%0A%20%20%3Cprint%2F%3E%0A%3C%2Fosm-script%3E&C=50.73515;7.20519;14&R
<osm-script output="json">
  <query type="node">
    <has-kv k="name" v="Gielgen"/>
  </query>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
[out:json];
node["name"="Gielgen"];
out body;

Формат CSV (Comma Separated Values): см. Overpass QL wiki page.

Отобразить результат: OpenLayers map, JSON, XML.

Запрос по id объекта

Если нужен конкретный id из базы данных, можно запросить его. Мы даём

  • пример для точки:
Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <id-query ref="507464799" type="node"/>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
node(507464799);
out;

Отобразить результат: OpenLayers map, JSON, XML.

  • пример для линии:
Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <id-query ref="24777894" type="way"/>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
way(24777894);
out;

Отобразить результат: OpenLayers map, JSON, XML.

  • пример для отношения:
Overpass XML Overpass QL
попробуйте сами в overpass-turbo
<osm-script>
  <id-query ref="1745069" type="relation"/>
  <print/>
</osm-script>
попробуйте сами в overpass-turbo
relation(1745069);
out;

Отобразить результат: OpenLayers map, JSON, XML.

Редактирование отфильтрованных данных

Этот раздел перемещён в Sparse Editing.

Справочник по языку

Этот раздел перемещён в language reference.

FAQ

См. Overpass API/FAQ#Language