Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API
У каждой карты есть легенда: именно она говорит читателю о том, что и каким образом на ней обозначено. Домам соответствуют многоугольники серого цвета, дорогам - отрезки и кривые, территории парков и скверов заливаются светло-зеленым и украшаются пиктограммой дерева. А к некоторым картам добавляют полезное приложение - список этих самых дорог с протяженностью, количество парков, лавочек и мусорных урн.
В процессе создания решений для автоматизации работы муниципальных служб мы отвели особое место для картографии, поскольку набор инструментов здесь практически не ограничен. На карте можно отображать актуальную информацию о местоположении объектов, маршруты движения уборочной техники, транспорта, план работы и тепловую карту с проблемными и “здоровыми” участками. Использование картографии в целом помогает ускорить время реакции и принятия решений по экстренным вопросам, упрощает процесс планирования и прогнозирования, а главное - вся информация доступна в максимально наглядном виде.
В ходе работы с одним из заказчиков перед нами возникла интересная задача - подсчитать количество объектов на карте по категориям.
Найти
Определить самый “зеленый” город в ЦФО по совокупности следующих данных: количество лавочек, урн и парков.
Дано
Картография. В качестве плацдарма мы выбрали OpenStreetMap (далее - OSM) по весьма простой причине - Open Source.
Решение
Существует несколько подходов к решению поставленной задачи. К примеру, мы можем использовать PostgreSQL для осуществление запросов к базе данных OSM и получения необходимых данных, можно использовать QGIS - систему для создания, анализа и публикации геопространственной информации. Однако, мы нашли более элегантный и эффективный способ - Overpass API.
Overpass API - мощный инструмент для извлечения данных из базы OSM по запросу пользователя. Он оптимизирован для задач любого масштаба: от получения нескольких элементов из базы до сотен миллионов объектов, которые отбираются согласно запросу в виде XML или Overpass QL - модернизированной версии Overpass XML.
Будем начинать все с чистого листа: в первую очередь потребуется развернуть OSM на сервере. В качестве операционной системы на нашей машине используется Ubuntu.
Q: Зачем разворачивать свой OSM?
A: Для работы с данными нам потребуется Overpass API, общедоступный сервер которого имеет ограничение на количество запросов в сутки. Именно по этой причине мы развернем свой сервер с OSM и Overpass API.
Подробная инструкция по установке OSM лежит здесь.
Следующим шагом мы устанавливаем Overpass API - его последний релиз можно найти тут. Команды для установки:
После установки потребуется провести populating - создание базы данных. База данных всего мира нам не нужна, поэтому мы воспользуемся замечательным сервисом Geofabrik, который позволяет получить данные по заданным административным регионам.
Достойная альтернатива Geofabrik - BBBike.
Мы загружаем и распаковываем базу данных, загруженную из каталога Europe > Russian Federation > Central Federal District в формате .osm.bz2, по следующей схеме:
ПУТЬ_К_INIT_OSM3S.SH ПУТЬ_К_ФАЙЛУ_BZ2 ПУТЬ_КУДА_РАСПАКОВЫВАТЬ ДИРЕКТОРИЯ_OVERPASS_API
Примечание: в данном случае все действия выполняются в каталоге overpass.
Итак, платформа практически готова - сейчас мы можем сделать свой первый запрос и узнать количество парков в целом по региону:
Примечание: ПУТЬ_К_OSM3S_QUERY --db-dir = ПУТЬ_К_DB
Мы уже близко: осталось только разбить парки по областям и городам. Справиться с этой задачей нам поможет отдельно запущенный и постоянно работающий Dispatcher.
Запускаем API и в директории /etc/apache2/ports.conf добавляем Listen ПОРТ:
Проверяем конфигурацию. Она должна выглядеть следующим образом:
Далее включаем новый хост и отправляем старый отдыхать:
Настало время включить первый Dispatcher, который будет обрабатывать наши запросы. Для этого воспользуемся командой:
Первый признак того, что все пошло по плану - создание файла osm3s_OVERPASS_API_ВЕРСИЯ_osm_base в директории с базой данных. В файле nohup.out появится сообщение о статусе Dispatcher - dispatcher just started.
Однако, работа на этом не заканчивается: требуется запустить ещё один Dispatcher. Для начала копируем папку rules в директорию с базой данных и раздаем права на появившийся в результате файл osm3s_OVERPASS_API_ВЕРСИЯ_areas.
Теперь мы можем сделать запрос по области и подсчитать количество парков в Рязани. И, кстати, это уже работает в адресной строке браузера:
Долгожданный ответ
Итак, теперь мы можем погрузиться в аналитику и вопросы благоустройства: найдем количество парков, лавочек и мусорных баков в 25 крупных городах ЦФО и сравним эти показатели при помощи гибких аналитических инструментов ODANT.
ODANT - цифровая интеграционная платформа отечественной разработки, предназначенная для построения информационных систем различной сложности и распределенности. Решения на базе ODANT обладают высоким уровнем гибкости, широкими интеграционными возможностями и отличаются простотой в разработке и эксплуатации. Подробнее об ODANT.
Так выглядят наши параметры для поиска урн: в рамках задачи мы не делаем различий между контейнерными площадками, отдельно стоящими урнами и пунктами приема ТБО.
Выходные данные мы экспортировали из ODANT в виде плоской таблицы:
В данном рейтинге город Владимир занимает почетную первую строчку: на одно место скопления мусора там приходится всего 234 человека. Мы оперируем данными в ODANT, поэтому легким движением руки превращаем таблицу в первый подходящий нам график.
Перейдем к следующему элементу - лавочкам.
Получаем следующий результат в виде таблицы
И снова Владимир оказался самым благоустроенным из всех претендентов: 602 человека на одну скамейку посадить не получится, но в Мытищах за места идет куда более ожесточенная борьба. Однако, всегда можно придумать расписание.
Немного визуализации для наглядности
Перейдем к самой интересной части: подсчет площади парков. Для решения этой задачи мы можем использовать несколько методов, но самым оупенсорсным и замечательным мы находим библиотеку Leaflet. В самом запросе потребуется заменить out count на out geom, что в результате даст нам координаты областей.
Создадим полигон
Теперь в area лежит площадь региона в м2. Извлекаем данные для выбранных нами городов и получаем следующую таблицу:
По данным OSM Зеленоград полностью оправдывает свое название - 11% площади города занято зелеными массивами. Используем инструменты ODANT для получения отношения количества жителей к количеству парков
Представим данные в виде графиков
И в финале - рейтинг городов, подсчитанный по занимаемым местам
Эпилог и выводы
Решением судейской коллегии в составе OpenStreetMap, Overpass API и ODANT, г. Владимир занимает почетное первое место и получает титул “Самый зеленый в ЦФО”.
Стоит отметить следующий факт: наше исследование базировалось исключительно на данных, отраженных в OSM. Естественно, в Мытищах есть еще пара сотен скамеек, да и в Туле куда больше мест для скопления отходов. Наши результаты можно рассматривать с другой стороны, к примеру, для оценки динамики внесения объектов городской инфраструктуры в базу данных OSM. Однако, в среднем люди “одинаково медленно” вносят данные в OSM, поэтому мы можем считать, что данные сравнительно достоверны и заслуживают внимания.
Нам удалось решить поставленную задачу и найти эффективный способ работы с объектами на картах OSM: им оказалась комбинация Overpass API и Leaflet. С помощью данного набора инструментов мы можем делать запросы к БД OSM и получать данные о количестве объектов, вычислять площади областей. Для представления данных и аналитики мы собрали web-решение на базе ODANT, которое удовлетворило все наши потребности.
Существует большое количество отраслей производства, бизнеса и хозяйства, которым могло бы помочь данное решение. Если есть идеи или обратная связь - было бы очень приятно обсудить. Мы в Инфостандарте потратили на задачу 28 чистых часов, возможно, у вас получится быстрее.
Ведущий frontend-разрабочтик - Епифанов Даниил.
Редактор - Морозов Никита.