Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

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

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

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью 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 - его последний релиз можно найти тут. Команды для установки:

sudo apt-get update sudo apt-get install g++ make expat libexpat1-dev zlib1g-dev apache2 -y wget http://dev.overpass-api.de/releases/osm-3s_ВЕРСИЯ.tar.gz tar -zxvf osm-3s_ВЕРСИЯ.tar.gz cd osm-3s_ВЕРСИЯ ./configure CXXFLAGS="-O2" --prefix=$EXEC_DIR make install cd ../ chmod -R 755 ./overpass

После установки потребуется провести populating - создание базы данных. База данных всего мира нам не нужна, поэтому мы воспользуемся замечательным сервисом Geofabrik, который позволяет получить данные по заданным административным регионам.

Достойная альтернатива Geofabrik - BBBike.

Мы загружаем и распаковываем базу данных, загруженную из каталога Europe > Russian Federation > Central Federal District в формате .osm.bz2, по следующей схеме:

ПУТЬ_К_INIT_OSM3S.SH ПУТЬ_К_ФАЙЛУ_BZ2 ПУТЬ_КУДА_РАСПАКОВЫВАТЬ ДИРЕКТОРИЯ_OVERPASS_API

Примечание: в данном случае все действия выполняются в каталоге overpass.

Итак, платформа практически готова - сейчас мы можем сделать свой первый запрос и узнать количество парков в целом по региону:

Примечание: ПУТЬ_К_OSM3S_QUERY --db-dir = ПУТЬ_К_DB

root@MIP-USER55:~# cd overpass/ root@MIP-USER55:~/overpass# ./osm-3s_v0.7.56.7/bin/osm3s_query --db-dir=db encoding remark: Please enter your query and terminate it with CTRL+D. [out:json][timeout:25]; ( nwr["landuse"="forest"]; ); out count; { ..., "elements": [ { "type": "count", "id": 0, "tags": { "nodes": "23", "ways": "19723", "relations": "4206", "total": "23952" } } ] }

Мы уже близко: осталось только разбить парки по областям и городам. Справиться с этой задачей нам поможет отдельно запущенный и постоянно работающий Dispatcher.

Запускаем API и в директории /etc/apache2/ports.conf добавляем Listen ПОРТ:

echo "ИМЯ_СЕРВЕРА localhost" | sudo tee /etc/apache2/conf-available/ИМЯ_СЕРВЕРА.conf && sudo a2enconf ИМЯ_СЕРВЕРА sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport ПОРТ -j ACCEPT sudo a2enmod cgi sudo a2enmod ext_filter sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/ИМЯ_КОНФИГА_ДЛЯ_СЕРВЕРА.conf

Проверяем конфигурацию. Она должна выглядеть следующим образом:

<VirtualHost *:ПОРТ> ServerAdmin webmaster@localhost ExtFilterDefine gzip mode=output cmd=/bin/gzip DocumentRoot ПУТЬ_К_OVERPASS_API/html ScriptAlias /api/ ПУТЬ_К_OVERPASS_API/cgi-bin/ <Directory "ПУТЬ_К_OVERPASS_API"> AllowOverride None Options Indexes FollowSymLinks Require all granted </Directory> <Directory "ПУТЬ_К_OVERPASS_API/cgi-bin/"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>

Далее включаем новый хост и отправляем старый отдыхать:

sudo a2ensite КОНФИГ.conf sudo a2dissite 000-default.conf sudo a2dissite ВСЕ_ДРУГИЕ_КОНФИГИ.conf sudo service apache2 reload

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

nohup ПУТЬ_К_OVERPASS_API/bin/dispatcher --osm-base --db-dir=ПУТЬ_К_DB --meta &

Первый признак того, что все пошло по плану - создание файла osm3s_OVERPASS_API_ВЕРСИЯ_osm_base в директории с базой данных. В файле nohup.out появится сообщение о статусе Dispatcher - dispatcher just started.

Однако, работа на этом не заканчивается: требуется запустить ещё один Dispatcher. Для начала копируем папку rules в директорию с базой данных и раздаем права на появившийся в результате файл osm3s_OVERPASS_API_ВЕРСИЯ_areas.

nohup ПУТЬ_К_OVERPASS_API/bin/dispatcher --areas --db-dir=ПУТЬ_К_DB & chmod 666 "../db/osm3s_OVERPASS_API_ВЕРСИЯ_areas" nohup ПУТЬ_К_OVERPASS_API/bin/rules_loop.sh ПУТЬ_К_DB &

Теперь мы можем сделать запрос по области и подсчитать количество парков в Рязани. И, кстати, это уже работает в адресной строке браузера:

http://localhost:ПОРТ/api/interpreter?data=[output:json][timeout:25]; area[name="Рязань"]->.searchArea; ( nwr["leisure"="park"](area.searchArea); ); out count;

Долгожданный ответ

"elements": [ { "type": "count", "id": 0, "tags": { "nodes": "0", "ways": "57", "relations": "11", "areas": "0", "total": "68" } } ] }

Итак, теперь мы можем погрузиться в аналитику и вопросы благоустройства: найдем количество парков, лавочек и мусорных баков в 25 крупных городах ЦФО и сравним эти показатели при помощи гибких аналитических инструментов ODANT.

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

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

nwr["amenity"="recycling"](area.searchArea); nwr["amenity"="waste_disposal"](area.searchArea); nwr["amenity"="waste_basket"](area.searchArea);

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

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

В данном рейтинге город Владимир занимает почетную первую строчку: на одно место скопления мусора там приходится всего 234 человека. Мы оперируем данными в ODANT, поэтому легким движением руки превращаем таблицу в первый подходящий нам график.

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API
Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

Перейдем к следующему элементу - лавочкам.

nwr["amenity"="bench"](area.searchArea);

Получаем следующий результат в виде таблицы

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

И снова Владимир оказался самым благоустроенным из всех претендентов: 602 человека на одну скамейку посадить не получится, но в Мытищах за места идет куда более ожесточенная борьба. Однако, всегда можно придумать расписание.

Немного визуализации для наглядности

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API
Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

Перейдем к самой интересной части: подсчет площади парков. Для решения этой задачи мы можем использовать несколько методов, но самым оупенсорсным и замечательным мы находим библиотеку Leaflet. В самом запросе потребуется заменить out count на out geom, что в результате даст нам координаты областей.

Создадим полигон

const polygon = L.polygon(КООРДИНАТЫ).addTo(map); const area = L.GeometryUtil.geodesicArea(polygon.getLatLngs());

Теперь в area лежит площадь региона в м2. Извлекаем данные для выбранных нами городов и получаем следующую таблицу:

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

По данным OSM Зеленоград полностью оправдывает свое название - 11% площади города занято зелеными массивами. Используем инструменты ODANT для получения отношения количества жителей к количеству парков

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

Представим данные в виде графиков

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API
Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

И в финале - рейтинг городов, подсчитанный по занимаемым местам

Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

Эпилог и выводы

Решением судейской коллегии в составе OpenStreetMap, Overpass API и ODANT, г. Владимир занимает почетное первое место и получает титул “Самый зеленый в ЦФО”.

Стоит отметить следующий факт: наше исследование базировалось исключительно на данных, отраженных в OSM. Естественно, в Мытищах есть еще пара сотен скамеек, да и в Туле куда больше мест для скопления отходов. Наши результаты можно рассматривать с другой стороны, к примеру, для оценки динамики внесения объектов городской инфраструктуры в базу данных OSM. Однако, в среднем люди “одинаково медленно” вносят данные в OSM, поэтому мы можем считать, что данные сравнительно достоверны и заслуживают внимания.

Нам удалось решить поставленную задачу и найти эффективный способ работы с объектами на картах OSM: им оказалась комбинация Overpass API и Leaflet. С помощью данного набора инструментов мы можем делать запросы к БД OSM и получать данные о количестве объектов, вычислять площади областей. Для представления данных и аналитики мы собрали web-решение на базе ODANT, которое удовлетворило все наши потребности.

Существует большое количество отраслей производства, бизнеса и хозяйства, которым могло бы помочь данное решение. Если есть идеи или обратная связь - было бы очень приятно обсудить. Мы в Инфостандарте потратили на задачу 28 чистых часов, возможно, у вас получится быстрее.

Ведущий frontend-разрабочтик - Епифанов Даниил.

Редактор - Морозов Никита.

11
Начать дискуссию