У ОСМ в России большая проблема с деревнями. Деревни есть, а домов нет. Раньше были проблемы с космоснимками, а сейчас с этим проблем нет.
В общем озадачился, начал потихоньку обрисовывать дома и столкнулся с некоторыми неудобствами. Визуально искать неотрисованные деревни сложно и велик шанс пропустить их.
Поэтому нужно было создать квест на 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 метров будут гарантировать что точка деревни точно относится к зданию, а не к ближайшей деревне.