Начинаем работу с Overpass Turbo – Часть 2

нет

В предыдущем посте мы обсудили базу данных Open Street Map (OSM) и ее компоненты: ноды, пути и связи. Эти компоненты маркируются с помощью тегов для описания их характеристик. В этом посте вы узнаете, как создавать различные запросы для поиска информации в Overpass Turbo.

Query Wizard

В Overpass Turbo встроен Query Wizard, который упрощает построение запросов. Перед отправкой в API запросы переводятся в скрипт Overpass Query.

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

Рассмотрим пример. Я хочу найти все железные дороги в пределах города Оснабрюк. Чтобы определить область поиска, мне нужно настроить карту так, чтобы она охватывала весь город.

Теги состоят из пары ключ-значение. В этом случае, поскольку я хочу найти все данные, связанные с железной дорогой, я буду использовать «railway» в качестве ключа и «*» в качестве универсального значения. В мастере запросов ключи и значения разделяются знаком «=».

Первоначальный запрос вернул все объекты с тегом «железная дорога», включая железнодорожные станции, мосты, переезды, платформы, сигнальные будки и другие объекты. Однако меня в первую очередь интересуют сами железнодорожные пути. Чтобы сузить результаты, я изменю запрос, заменив значение «*» на конкретное значение «rail».

При повторном выполнении запроса результаты отличаются. Теперь отображаются только те объекты, которые соответствуют тегу «railway=rail». В нижнем углу карты указано, что в выбранной области имеется 613 нод и 186 путей, которые соответствуют критериям запроса.

Прежде чем переходить к более сложным запросам, стоит взглянуть на язык запросов Overpass, созданный в левой панели. Это фактический код, отправляемый в API, и для более сложных запросов иногда необходимо его редактировать. Вот запрос, в результате которого были получены данные, показанные на изображении выше.

[out:json][timeout:25];
// gather results
(
 // query part for: “railway=rail”
 node[«railway»=»rail»]({{bbox}});
way[«railway»=»rail»]({{bbox}});
relation[«railway»=»rail»]({{bbox}});
);
// print results
out body;
>;
out skel qt;

Первый тег, [out:json], указывает Overpass возвращать данные в формате JSON. Однако возможны и альтернативные форматы, такие как CSV или XML. Эти теги позволяют экспортировать данные для личных проектов.

Тег [timeout:25] устанавливает ограничение на запрос к базе данных в 25 секунд. Это предотвращает прерывание соединения при обработке больших запросов. Вы можете изменять это значение в зависимости от ваших требований.

Основная часть запроса находится здесь:

node[«railway»=»rail»]({{bbox}}); 
way[«railway»=»rail»]({{bbox}})
relation[«railway»=»rail»]({{bbox}});

На самом деле существует три отдельных запроса. Один для нод, другой для путей и третий для связей. Любой тип объекта будет возвращен, если он соответствует параметру «железная дорога=путь».

Если вы пишете запросы вручную, вы можете избежать этого повторения, используя термин «nwr» вместо того, чтобы писать отдельные запросы для нод, путей и связей. Это даст тот же результат, что и запрос выше:

[out:json][timeout:25];
// gather results
(
 // query part for: “railway=rail”
 nwr[«railway»=»rail»]({{bbox}});
 );
// print results
out body;
>;
out skel qt;

Комбинирование тэгов – AND

После использования тегов для базового поиска мы можем перейти к построению более сложных запросов. В данном примере наша цель — найти все военные авиабазы на севере Германии.

Используя запрос «landuse=military», мы можем определить все земельные участки, предназначенные для военных целей на севере Германии.

Но мне нужны только аэродромы, а не все военные объекты. Поэтому после поиска в TagInfo подходящих ключей я могу добавить тег military=airfield в мастер.

Комбинация таких ключей требует использования оператора AND (хотя его не нужно писать с большой буквы). В мастере это выглядит следующим образом: landuse=military and military=airfield

На языке Overpass Query это будет выглядеть так:

[out:json][timeout:25];
// gather results
( node[«landuse»=»military»][«military»=»airfield»]({{bbox}}); way[«landuse»=»military»][«military»=»airfield»]({{bbox}}); relation[«landuse»=»military»][«military»=»airfield»]({{bbox}});
);
// print results
out body;
>;
out skel qt;

Обратите внимание, что в запросах AND параметры тега следуют один за другим:

node[«landuse»=»military»][«military»=»airfield»]({{bbox}}); 

Для запроса OR они находятся на отдельных строках, разделенных символом «;».

node[«landuse»=»military»]({{bbox}}); 
node[«military»=»airfield»]({{bbox}});

Запуск запроса теперь показывает только военные авиабазы; все военные земли, не относящиеся к авиабазам, отфильтрованы:

Комбинирование запросов – OR

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

С помощью Overpass Turbo вы можете выбрать желаемый район отдыха в Дорсете, а затем проверить наличие этих опасностей. Это поможет вам определить подходящие места для кемпинга, где вы сможете безопасно запустить дрон без каких-либо ограничений. В Query Wizard запрос будет выглядеть так:

landuse=military or power=line or aerodrome:type=civil or boundary=protected_area

На карте отмечены линии электропередач, аэродромы, военные зоны и охраняемые территории. Для дрона остается не так много места.

Комбинирование нескольких OR запросов

Булевы операторы, такие как OR и AND, позволяют строить более сложные запросы. В другом вымышленном примере рассмотрим потребность в данных для исследования потенциальной связи между выработкой электроэнергии за счет сжигания угля или отходов и заболеваниями у детей.

Задача состоит в том, чтобы определить районы, где дети могут подвергаться наибольшему воздействию этих источников энергии.

После выбора подходящих тегов из Taginfo можно создать запрос в мастере запросов Overpass Turbo. Вот пример запроса, в котором параметры OR заключены в скобки:

(generator:source=waste or generator:source=coal) and (amenity=school or building=school)

Вот результат – все школы и электрогенераторы, работа которых зависит от сжигания угля или отходов в регионе Гамбурга:

Карта выглядит красиво, но на деле не слишком полезна: слишком много точек, и на карте не очевидно, где находятся школы, а где электростанции.

Найти X рядом с Y в радиусе Z

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

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

Сначала пропишем алгоритм действий свободным языком:

Поместить все электростанции в группу под названием «power_sources».
Поместить все школы в группу под названием «schools».

Создать новую группу, состоящую из всех «школ», которые находятся в пределах 1000 м от объекта «power_sources», и отобразить ее на карте.

Теперь с помощью небольшого редактирования мы можем объединить все объекты электростанций в переменную под названием «power_sources»:

[out:json][timeout:25];
// gather results
 // query part for: “»generator:source»=waste”
   (node[«generator:source»=»waste»]({{bbox}});
   way[«generator:source»=»waste»]({{bbox}});
   relation[«generator:source»=»waste»]({{bbox}});

 // query part for: “»generator:source»=coal”
   node[«generator:source»=»coal»]({{bbox}});
   way[«generator:source»=»coal»]({{bbox}});
relation[«generator:source»=»coal»]({{bbox}});)->.power_sources;

Затем мы объединяем все школы в переменную «schools»:

// query part for: “amenity=school”
 (node[«amenity»=»school»]({{bbox}});
 way[«amenity»=»school»]({{bbox}});
 relation[«amenity»=»school»]({{bbox}});
// query part for: “building=school”
 node[«building»=»school»]({{bbox}});
 way[«building»=»school»]({{bbox}});
 relation[«building»=»school»]({{bbox}});)->.schools;

Наконец, мы говорим Overpass отобразить школы, которые находятся в пределах 1000 м от «power_sources»:

nwr.schools(around.power_sources:1000);
// print results
out body;
>;
out skel qt;

Если вы хотите сами поиграть с этим запросом, вы можете посмотреть его здесь.

Вот результат нашего поиска:

Теперь мы видим, что в Гамбурге есть четыре школы, расположенные в пределах 1000 м от электростанции, и они могут стать хорошим местом для начала нашего исследования.

Определение области поиска

До сих пор в рассмотренных нами запросах использовалась ограничительная рамка, которая соответствует видимой области в окне карты. Однако такой подход не всегда подходит, особенно при поиске в пределах конкретного города или региона, который не имеет аккуратной прямоугольной формы.

Например, рассмотрим задачу поиска всех полицейских участков в Лондоне. Запрос будет выглядеть следующим образом:

nwr[«amenity»=»police»]({{bbox}});
out;

Такой запрос нам не поможет, так как показывает все полицейские участки в пределах окна карты, а не Лондона.

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

// Set the area by name
area[«name»=»Greater London»];
//Search for object types in the defined area
nwr[«amenity»=»police»](area);
out;

Объект «area» просто заменяет объект {{bbox}} в запросе. Вы можете увидеть разницу в результатах:

Экспортируем данные

В Overpass Turbo у вас есть возможность экспортировать полученные данные в файлы GeoJSON или KML, а также экспортировать PNG-файл самой карты. Чтобы получить доступ к этим опциям экспорта, просто нажмите на кнопку «Экспорт» и изучите доступные форматы.

Оригинал статьи можно прочитать по ссылке.

Также подписывайтесь на наш телеграм, чтоб быть в курсе всех новостей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *