Overpass turbo для чайников

Overpass turbo для чайников

@osint_box by Leonid

OSM

Для начала пару слов об OpenStreetMap.

OpenStreetMap (дословно «открытая карта улиц»), сокращённо OSM — некоммерческий веб-картографический проект по созданию силами сообщества участников — пользователей Интернета подробной свободной и бесплатной географической карты мира. В OpenStreetMap при создании карты используется принцип вики. Каждый зарегистрированный пользователь может вносить изменения в карту.

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

OpenStreetMap использует топологическую структуру данных, состоящую из объектов:

  • node (точка) — базовый элемент, имеющий координаты (широта и долгота), из совокупности точек состоят более сложные объекты (как правило, точками обозначаются объекты, не имеющие протяженности: столбы, вышки, остановки, шлакбаумы, наименования магазинов);
  • way (линия) — это последовательность точек. Если первая точка линии совпадает с последней, получается замкнутая линия. Замкнутая линия может обозначать полигон как объект с конкретной площадью. Линиями могут обозначать контуры каких-либо территорий или объектов, например, зданий, парков, некоторых водных объектов (реки, озера); также улицы, проезды, тротуары и т.п.;
  • relation (отношение) — группы точек, линий и других отношений, которым назначаются некоторые свойства. Отношение группирует более простые сущности в более сложные. Как правило, отношениями являются территории в определенных границах: районы, здания, парки, площадки, реки. Отношения могут состоять из более простых объектов. Например, автобусный маршрут также будет являться отношением, состоящим из линии маршрута и остановок, обозначенных точками.
  • tag (тег) — пары «ключ — значение», могут назначаться точкам, линиям и отношениям. Тегами описываются свойства этих объектов.

Таким образом, некоторые объекты, такие как здание, водоем или участок местности, например, могут быть описаны как линия (way) либо как отношение (relation).

Это если в двух словах, что нам нужно знать про OSM.

Overpass Turbo

Хорошо, скажете вы, это все прекрасно, кто-то подробно размечает объекты всей планеты на карте, как нам можно это использовать в геопространственной разведке? Т.е. чтобы по фотографии куска жеппы найти место, где оно снято?

Да, и для этого есть инструмент! И называется он Overpass Turbo — это веб-инструмент для фильтрации OpenStreetMap, один из самых востребованных инструментов в геопространственной разведке. С Overpass Turbo вы можете выполнять любые запросы по собственным заданным параметрам поиска (например, найти все трехэтажные дома с номером 12 в радиусе 15 метров от трамвайных путей в городе N и т.п.) и анализировать результаты из OSM на интерактивной карте.

Для этой цели он имеет специально созданный язык запросов (Overpass QL), при помощи которого возможно отфильтровать необходимые сущности в OSM (node, way и relations, в т.ч. в описании которых имеются определенные теги, и их взаимоотношения). В интерфейсе Overpass Turbo в правой части имеется карта, в левой - поле для ввода запросов на языке Overpass QL.

Overpass QL прост и понятен. Операторы в нем выполняются один за другим. Каждый опратор должен заканчиваться точкой с запятой (;), кторая отделяет оператор от следующего.

Операторы записывают результат в так называемые наборы данных, которые затем передаются на вход последующим операторам. Если набор не указан явно, то используется набор данных по умолчанию, который имеет имя "_".  После каждого оператора он перезаписывается. Иногда бывает полезно использовать более одного контейнера (набора данных) во время более сложного запроса. В этом случае выходные данные могут быть перенаправлены в другой контейнер, например, с именем "a" (->.a), т.е. именованные наборы данных.

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

Давайте посмотрим, как при помощи Оверпасса могли быть решены рассмотренные ранее задачи отсюда и отсюда.

Итак, найти дачные домики в Берлине:

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

natural=water - описывает природный водный объект;

surface=grass_paver - покрытие дороги - газонная решетка;

building=allotment_house - здание - садовый домик.

Составим запрос на Overpass QL с этими тегами:

(
 way["natural"="water"]({{bbox}});
 relation["natural"="water"]({{bbox}});
)->.a;
 way["surface"="grass_paver"]({{bbox}})(around.a:30)->.b;
 way["building"="allotment_house"]({{bbox}})(around.b:5);
out;>;
out skel;


Мы помним, что водный объект может быть обозначен как way, так и relation, поэтому отбираем оба варианта, объединяя их в скобки. Из полученных объектов создаем проименованный набор данных, и присваиваем ему имя .a :

({{bbox}}) - сокращение от "bounding box" (ограничивающая рамка) - означает, что будут отбираться объекты на карте, ограниченные рамкой отображаемой части карты на экране.

Далее отбираем все сущности, имеющие тег grass_paver (а раз такой тег свойственен только дорожному покрытию, дополнительно нет необходимости указывать тег дороги), находящиеся на расотянии 30 метров от сущности .a, т.е. от водоема. И присваиваем новому набору данных имя .b :

Далее отбираем дачные домики (тег allotment_house), находящиеся на рассотянии 5 метров от сущности .b, т.е. от дороги:

Выводим результат на карту:

Результат применения такого запроса в Берлине:

Как видим, одним запросом в Оверпасс можно было найти место из той задачи.

Но не всегда все так идеально. Как мы помним, объекты на карте размечают пользователи, и не всегда объектам присваиваиваются нужные теги. Некоторые объекты и вовсе могут отсутствовать на карте, тут уже все зависит от особенностей местности: в одной стране более подробно размечают здания, в другой - дороги, в третьей - банкоматы. Даже в нашем примере тегом building=allotment_house (дачный домик) помечены лишь первые два дома:


Остальные здания просто размечены как building=yes :

Чем подробнее составлен запрос, с использованием более редких тегов, тем он точнее, но тем и меньше шанс наличия этих самых тегов, и, соответственно, успешного выполнения запроса. Если запрос будет составлен с использованием основных тегов, которые почти всегда присутствуют на карте, он будет менее точен и выдаст больше посторонних объектов, подпадающих под условия запроса. Зато вероятность, что в выборке полученных объектов содержится искомый, будет значительно выше. Наша задача - подобрать нужную комбинацию, балансируя между точностью запроса и вероятностью его успешного выполнения.

Для примера, если бы мы в запросе использовали более вероятные общие теги: вместо building=allotment_house - building=yes (или просто building) и вместо surface=grass_paver highway=service (проезд по прилегающей территории):

И это только в районе местности из задачи


Другой пример - поиск места съемки изображения:

Для начала определимся с объектами. Мы точно видим дорожные знаки "Место остановки автобуса", "Осторожно, дети" и "Пешеходный переход". Следовательно, в районе места съемки находится автобусная остановка, рядом с ней пешеходный переход, а где-то поблизости должна быть школа или детский сад. Причем, судя по соотношению телевышки и домов, место съемки находится на расстоянии 5-10 км. от Останкинской телевышки. Кроме того, можно распознать элементы подвесной конструкции контактного провода трамвайной линии:

С большой долей вероятности здесь ходит трамвай

Учитывая вышеизложенное, составляем запрос:

{{geocodeArea:Moscow}}->.searchArea;
(
 (
 nwr["amenity"="school"](around:10000, 55.8197301, 37.6118953);
 -nwr["amenity"="school"](around:5000, 55.8197301, 37.6118953);
  );
  (
  nwr["amenity"="kindergarten"](around:10000, 55.8197301, 37.6118953);
  -nwr["amenity"="kindergarten"](around:5000, 55.8197301, 37.6118953);
  );
)->.school;
(
 nwr["highway"="crossing"](area.searchArea);
 nwr["crossing"="marked"](area.searchArea);
 nwr["crossing"="zebra"](area.searchArea);
)->.crossing;
 nwr["railway"="tram"](area.searchArea)->.tram;
 nwr["highway"="bus_stop"](around.crossing:30)(around.school:100)(around.tram:15);
out skel;

Как вы уже могли заметить, чтобы объединить все сущности (node, way и relation) одним запросом, можно указать nwr. Также поддерживаются сочетания nw, nr, wr.

Разберем элементы запроса:

Если в первом примере мы определяли поисковую область параметром bbox, то здесь определяем ее в первой строке параметром geocodeArea:Moscow - как понятно, географическая область Москва. {{geocodeArea}} позволяет выбирать наиболее подходящие области по их именам, а также страны по их двухбуквенным кодам. В конце строки мы присваиваем значение .searchArea выбранной местности.

Далее мы отбираем все школы (amenity=school) и детские сады (amenity=kindergarten) в радиусе от 5 до 10 км. от Останкинской телебашни:

т.е. берем координаты телевышки 55.8197301, 37.6118953, затем выбираем школы в радиусе 10000 метров от координат: nwr["amenity"="school"](around:10000, 55.8197301, 37.6118953); из этого радиуса вычитается радиус в 5000 метров аналогичной строкой:  -nwr["amenity"="school"](around:5000, 55.8197301, 37.6118953); То же самое проделывается и для детских садов. Полученной выборке школ и детских садов присваивается значение .school

Далее выбираются возможные варианты маркировки пешеходного перехода: highway=crossing, crossing=marked и crossing=zebra в зоне поиска (searchArea) и объединяются в одну сущность .crossing :

Отбираем трамвайные пути (railway=tram):

И в итоге отбираем автобусную остановку (highway=bus_stop), которая находится на расстоянии 30 метров от пешеходного перехода (.crossing), 100 метров от школы (.school) и 15 метров от травайных путей (.tram):

Выводим результат на карту:

Итог:

Всего получилось 19 точек в 13-ти местах, не так то много для целой Москвы. Среди которых на глаз можно определить прямую длинную улицу с направлением на Останкинскую телебашню
Остановка в искомом районе
Остановка, переход, трамвайные пути и школа

Так, ну вроде бы принцип работы Overpass понятен. Все, конечно, здорово, запросы все эти, теги... но ведь тегов тысячи для обозначения всего на свете, скажете вы, как их вообще можно запомнить, чтобы составить хоть какой-нибудь запрос? А не надо запомнить. Есть метод.

М - метод

Для использования Оверпасса вовсе необязательно знать все теги (хотя, для профессионального составления запросов все же понадобятся некторые знания о возможных вариантах разметки сущности, это придет потом, с опытом. Например, теги для обозначения пешеходного прехода из примера могут быть разными: highway=crossing, crossing=marked и crossing=zebra).

Итак, допустим, перед нами фотография неизвестоного места, нам требуется установить, где оно находится. Для этого необходимо знать, какими тегами какие объекты на фото могут быть размечены, но мы не знаем. Зато мы точно знаем аналогичные объекты, которые встречали когда-то в повседневной жизни и знаем, где такие объекты находятся. Требуется найти пешеходный переход? Открываем OSM в знакомой нам местности, находим знакомый нам переход и смотрим его свойства. Для чего тыкаем правой кнопкой мыши в нужную область и в контекстном меню выбираем пункт "Что здесь?":

Происходит отбор объектов в границах круга

И выводится полный список объектов в выбранном месте:

В выборке мы видим Перекрёсток #5067539295 - это и есть пешеходный переход. Нажимаем на его ID и попадаем на страницу описанием его тегов:

Таким образом мы можем узнать теги любого интересующего нас объекта.

Но и это еще не все.

Нажав на соответствующий тег, например, highway=crossing, мы попадаем на страницу Вики ОСМ (по highway=crossing, например), где подробнейшим образом расписана информация от тегах и об их использовании:

Примеры и теги пешеходных переходов
Примеры использования тега building

Страница описания тега building, например.

По каждому тегу дается описание, как его необходимо применять, общее количество тегов данного вида на OSM:

Видим, что highway=crossing должен применяться только в виде точки (node), однако же 367 вариантов кто-то занес в way

И самое интересное, что здесь же дается ссылка на построение запроса с таким тегом в Оверпасс:

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

Отбор всех пешеходных переходов в области просмативаемой карты

Таким образом, не зная всех тегов наизусть, мы можем составлять запросы.

Еще для наших целей весьма неплохо сгодится инструмент для поиска тегов в OSM - TagFinder. Мы просто вводим в поисковую строку соответствующий тег и получаем о нем всю информацию. Тут достаточно простого знания английского (если нет - переводчик гугл в помощь):

Найдено 339 тегов, обозначающих здания с изображениями и описанием
Пример описания тега building

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


Вывод данных

В автоматически выстроенном запросе можно встретить такие операторы, отвечающие за вывод данных:

Что это все означает?

Оператор out выводит содержимое набора. Он почти всегда используется в любом запросе Overpass. Простейшая форма оператора out имеет несколько подразумеваемых значений по умолчанию:

out; - простейшая форма оператора

._ out body; - идентично простому out;

_ - данный оператор можно заменить на любой проименованный нами набор из запроса (например, .school out;)

Оператор out может быть настроен с произвольным количеством параметров, которые добавляются через пробел между словом out и точкой с запятой (out skel qt; и т.п.). Допустимо использование следующих значений (в любом порядке), данные значения используются для степени детализации вывода (по умолчанию используется body;):

ids; - вывести только идентификаторы элементов в наборе

skel; - вывести минимальную информацию, необходимую для геометрии:

  • для точек (node): id и координаты
  • для линий (way): id и идентификаторы составляющих точек
  • для отношений (relations): id отношения, а также id, тип и роль всех его составляющих членов.

body; - вывести всю информацию, необходимую для использования данных. В т.ч. теги для всех элементов и роли для членов отношения

tags; - вывести только идентификаторы и теги для каждого элемента, а не координаты или составляющих членов

meta; - вывести все, что известно об элементах. Meta включает в себя все, что может быть выведено оператором body для каждого элемента OSM, а также версию, идентификатор набора изменений, отметку времени и данные о пользователе, который последним делал правки по объекту.

Пример вывода операторов (слева-направо): 1 - meta; 2 - body; 3 - skel;

Т.е. в ряде случаев для визуализации полученной выборки на карте различий операторов не будет (за исключением ids - выведет только текстовый набор идентификаторов без отображения на карте). Различия имеются лишь в выводимом наборе данных по каждому объекту, который можно увидеть нажав на соответствующий объект, либо переключившись в режим просмотра данных справа-вверху:

Для простого вывода объектов на карту можно использовать skel; - минимально необходимый набор данных об объекте для вывода на карту. Нажав на id нужного объекта, всю имеющуюся информацию о нем можно увидеть на OSM в открывшемся новом окне:

Возможности операторов также приведены в таблице:

Далее.

К оператору вывода можно добавить один из следующих модификаторов геолокационной информации (по умолчанию отсутствует):

geom; - добавить полную геометрию к каждому объекту. Это добавляет координаты к каждой точке, к каждой точке, составляющей линию или отношение, и добавляет последовательность "nd" членов с координатами ко всем отношениям.

bb; - добавляет к элементу только ограничивающую рамку каждого элемента. Для точек (node) это эквивалентно "geom". Для линий (way) это ограничивающая рамка всех точек. Для отношений (relations) это ограничивающий прямоугольник всех составляющих: точек и линий, входящих в отношение.

center; - добавляет к линиям и отношениям только центр упомянутого выше ограничивающего прямоугольника.

Использование geom:

один магазин

В запросе Overpass API вернёт данные об объектах всех типов, но Overpass Turbo отобразит на карте только магазины-точки. Дело в том, что в ответе сервера для каждой линии будет передан лишь список идентификаторов точек, но не будет координат самих точек. Аналогично, отношения в ответе будут содержать ссылки на члены-линии и члены-точки, но самих членов не будет в ответе. Один из способов исправить это - добавить параметр geom в оператор вывода:

два магазина

Следующие операторы могут быть добавлены для порядка сортировки (по умолчанию asc; Оять же, актуально только для вывода в виде текста на вкладке "данные"):

asc; - сортировка по идентификатору объекта

qt; - сортировка по индексу расположения на карте; это близко географическому расположению объектов и значительно быстрее, чем в порядке идентификаторов (через пробел можно указать неотрицательное целое число, которое ограничивает вывод до максимума заданного числа точек).

Рекурсия.

Рекурсию обозначает тот самый символ больше/меньше в некоторых запросах (>;). Многие успешно составляют запросы в Overpass QL, даже не зная о его функции, однако, задаются вопросом: а зачем оно здесь? И почему иногда без этого знака Оверпасс ругается?

Коротко о том, зачем нужна рекурсия. Чтобы понять ее смысл, нужно понять, как работает вывод данных на карту в Оверпассе. Оверпасс выводит все данные, полученные в ходе выполнеия запроса. Допустим, отбор сущностей в запросе был ограничен рамкой зкрана {{bbox}}, тогда он должен вернуть нам все точки, линии и отношения, находящиеся в этой рамке, так? Так то оно так, но ведь линии и отношения являются сложносоставными структурами и могут (а скорее всего, так и есть) не помещаться в экран, и в рамке экрана окажется лишь часть линии либо отношения. А что Оверпассу нужно будет сделать с оставшейся частью линии/отношения, не подскажете? Тоже отображать? Или наоборот, не показывать? Так вот специально для таких случаев и были придуманы все эти рекурсии.

Рекурсия вниз - обозначается знаком "больше" (>;). Принимает входной набор данных (в данном случае, полученный в ходе выполнения запроса) и преобразует его в выходной набор данных (результат, отображаемый набор данных), который включает в себя:

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

Т.е. "рекурсия вниз" расширяет результаты запроса.

Пример:

пример рекурсии вниз при отборе всех объектов (nwr) в небольшом районе Бонна
как видим, выбраны объекты, далеко выходящие за пределы рамки
при отборе только точек (node) рекурсия вниз значения не имеет, т.к. выводятся только точки внутри рамки, даже если они являются составляющими линий/отношений


Рекурсия вверх - обозначается знаком "меньше" (<;). Принимает входной набор данных (в данном случае, полученный в ходе выполнения запроса) и преобразует его в выходной набор данных (результат, отображаемый набор данных), который исключает все линии и отношения, выходящие за пределы ограничительной рамки. Части таких линий и отношений, находящиеся внутри ограничительной рамки, будут отмечены пунктиром.

Пример.

для node и nwr результат будет одинаков - отображение объектов внутри рамки, пунктиром отображаются объекты, выходящие за пределы рамки

Разница в выводе skel и body (отличаются наличием тегов пользователя) с рекурсией вверх на примере района Москвы:


Рекурсия вверх и вниз: все линии и отношения полностью - обозначается знаками "меньше" и "больше" (<;>;). Включает в себя все точки в ограничивающей рамке, все линии, содержащие любую из этих точек, все точки-члены этих линий, независимо от того, находятся ли они внутри ограничивающей рамки или нет, все отношения, которые имеют такую точку или линию в качестве члена, и составляющие точки и линии этих отношений, и даже точки составляющих линий. Обратите внимание, что из-за задействованных отношений, включаются объекты, находящиеся довольно далеко за пределами ограничивающей рамки.

мы помним о результате запроса точек (node) с рекурсией вниз - запрос вернул только точки. В случае с рекурсией вверх и вниз результат для точек будет аналогичен рекурсии вниз от nwr

Вместо заключения.

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


Рекомендации к изучению по теме:

https://habr.com/ru/company/vk/blog/591879/ - статья на Хабре от Вк, в материале использовал некоторые выдержки оттуда

https://wiki.openstreetmap.org/wiki/RU:Overpass_turbo - об Overpass turbo

https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL - руководство по языку Overpass QL

https://wiki.openstreetmap.org/wiki/Overpass_API - еще оттуда

https://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide - и еще

https://wiki.openstreetmap.org/wiki/Main_Page - википедия ОСМ, поиск тегов

https://tagfinder.osm.ch/ - поиск тегов

https://maps.mail.ru/osm/tools/overpass/ - Overpass Turbo на сервере Мейл ру

https://t.me/osint_mindset/170 - материал @Osint_mindset от @Dukera














Report Page