OpenStreetMap logo OpenStreetMap

У ОСМ в России большая проблема с деревнями. Деревни есть, а домов нет. Раньше были проблемы с космоснимками, а сейчас с этим проблем нет.

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

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

Пришло время осваивать Overpass

В ходе изучения была найдена старая тема на форуме “Overpass API - примеры запросов”. Собственно там и был найден и немного модифицирован подходящий запрос.

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

area
  ["boundary"="administrative"]
  ["name"="Хиславичский район"]
->.b;

(
  node(area.b)
  	["place"~"hamlet|village|locality"];
)->.c;

(
  way[building](around.c:500)->.build;
) -> .build;

(
  node(around.build:100)
  	["place"~"hamlet|village|locality"];
) -> .d;

(.c; - .d;)->.result;

.result out center;

Что делает данный запрос?

Выбираем район и сохраняем в переменную b:

area
  ["boundary"="administrative"]
  ["name"="Хиславичский район"]
->.b;

Далее ищем деревни в этой области. Значением locality отмечаются заброшенные деревни, решил тоже выделить чтоб перепроверить.

(
  node(area.b)
  	["place"~"hamlet|village|locality"];
)->.c;

Ищу деревни в которых есть обрисованные здания в радиусе 500 метров. К сожалению я не понял как с помощью Overpass написать запрос где наоборот нет зданий.

(
  way[building](around.c:500)->.build;
) -> .build;

У меня есть набор зданий, но я не знаю как мне найти точку населенного пункта. Придётся делать схожий запрос, но теперь ищем точку НП в радиусе 100 метров от здания и сохраняем в переменную d. 100 метров будут гарантировать что точка деревни точно относится к зданию, а не к ближайшей деревне.

(
  node(around.build:100)
  	["place"~"hamlet|village|locality"];
) -> .d;

Далее беру предыдущий набор всех всех деревень и вычитаю из них деревни в которых мы нашли здания. В result получаем НП у которых нет зданий в 500 метрах.

(.c; - .d;)->.result;

.result out center;

https://overpass-turbo.eu/s/19Z8

Выгрузил результат в виде geojson и загрузил в MapRoulette. Встроенный в рулетку Overpass почему-то не справился с запросом. https://maproulette.org/browse/challenges/20454

В MapRoulette есть русский язык и создание квеста достаточно простая процедура.

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

Email icon Bluesky Icon Facebook Icon LinkedIn Icon Mastodon Icon Telegram Icon X Icon

Discussion

Log in to leave a comment