Как стать автором
Обновить

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

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

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

Использование картографии в целом помогает ускорить время реакции и принятия решений по экстренным вопросам, упрощает процесс планирования и прогнозирования, а главное — вся информация доступна в максимально наглядном виде.

В ходе работы с одним из заказчиков перед нами возникла интересная задача — подсчитать количество объектов на карте по категориям.

Найти


Определить самый “зеленый” город в ЦФО по совокупности следующих данных: количество лавочек, урн и парков.

Дано


Картография. В качестве плацдарма мы выбрали OpenStreetMap (далее — OSM) по весьма простой причине — Open Source.

Решение


Существует несколько подходов к решению поставленной задачи. К примеру, мы можем использовать PostgreSQL для осуществление запросов к базе данных OSM и получения необходимых данных, или использовать QGIS — систему для создания, анализа и публикации геопространственной информации. Однако, мы нашли более элегантный и эффективный способ — Overpass API.

Overpass API — мощный инструмент для извлечения данных из базы OSM по запросу пользователя. Он оптимизирован для задач любого масштаба: от получения нескольких элементов из базы до сотен миллионов объектов, которые отбираются согласно запросу в виде XML или Overpass QL — модернизированной версии Overpass XML. Подробнее об Overpass API — здесь.
Будем начинать все с чистого листа: в первую очередь потребуется развернуть 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 — здесь.
Так выглядят наши параметры для поиска урн: в рамках задачи мы не делаем различий между контейнерными площадками, отдельно стоящими урнами и пунктами приема ТБО.


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

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

Город


Урны


Население


Население/Урны


Владимир


1525


356937


234


Красногорск


274


175554


641


Калуга


376


332039


883


Тамбов


279


292140


1047


Москва


11473


12678079


1105


Коломна


111


140129


1262


Балашиха


378


507366


1342


Курск


336


452976


1348


Рыбинск


129


184635


1431


Мытищи


140


235504


1682


Люберцы


119


205295


1725


Зеленоград


140


250453


1789


Воронеж


544


1058261


1945


Тверь


225


449507


1998


Ярославль


273


608353


2228


Муром


43


106984


2488


Подольск


114


308130


2703


Химки


89


259550


2916


Кострома


72


276929


3846


Липецк


124


509420


4108


Рязань


118


539290


4570


Королёв


49


224348


4579


Тула


101


475161


4705


Электросталь


32


156026


4876




В данном рейтинге город Владимир занимает почетную первую строчку: на одно место скопления мусора там приходится всего 234 человека. Используя встроенные инструменты ODANT строим два занятных графика.





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

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

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

Город


Лавочки


Население


Население/лавочки


Владимир


593


356937


602


Тамбов


413


292140


707


Москва


13970


12678079


908


Красногорск


143


175554


1228


Балашиха


411


507366


1234


Зеленоград


185


250453


1354


Тверь


268


449507


1677


Люберцы


115


205295


1785


Калуга


176


332039


1887


Курск


214


452976


2117


Муром


42


106984


2547


Тула


172


475161


2763


Коломна


49


140129


2860


Воронеж


272


848752


3120


Подольск


79


308130


3900


Рязань


132


539290


4086


Кострома


61


276929


4540


Химки


43


259550


6036


Рыбинск


25


184635


7385


Ярославль


78


608353


7799


Липецк


55


509420


9262


Электросталь


16


156026


9752


Королёв


23


224348


9754


Мытищи


17


235504


13853



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

Визуализируем наши результаты.





Перейдем к самой интересной части: подсчет площади парков. Для решения этой задачи мы можем использовать несколько методов, но самым оупенсорсным и замечательным мы находим библиотеку Leaflet. В самом запросе потребуется заменить out count на out geom, что в результате даст нам координаты областей.
Leaflet — библиотека с открытым исходным кодом, написанная на JavaScript, предназначенная для отображения карт на веб-сайтах. Поддерживает большинство мобильных и стационарных платформ из числа тех, что поддерживают HTML5 и CSS3. Leaflet позволяет разработчику, не знакомому с ГИС, легко отображать растровые карты, состоящие из маленьких фрагментов — тайлов, с, возможно, дополнительными слоями, накладываемыми поверх основного. Подробнее о Leaflet — здесь.

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

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

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

Город


Общая площадь парков (km2)


Площадь города (km2)


Процент пространства, занимаемого парками


Кол-во

парков


Зеленоград


4.13


37.199


0.111


26


Калуга


12.60


168.8


0.075


140


Москва


121.75


2561.5


0.048


1469


Люберцы


0.60


12.87


0.047


28


Владимир


4.62


137.14


0.034


104


Химки


3.55


109.8


0.032


27


Подольск


1.29


40.39


0.032


53


Балашиха


1.78


62.8


0.028


55


Тамбов


2.71


96.58


0.028


140


Тула


4.09


145.8


0.028


102


Кострома


3.95


144.5


0.027


50


Красногорск


0.69


25.65


0.027


21


Рязань


4.32


224.163


0.019


96


Ярославль


3.68


205.8


0.018


176


Королёв


0.97


55.47


0.017


30


Курск


3.31


208.2


0.016


862


Коломна


1.03


65.1


0.016


21


Мытищи


0.53


34.59


0.015


30


Воронеж


8.25


596.51


0.014


414


Липецк


4.44


330.15


0.013


78


Тверь


1.38


152.22


0.009


129


Муром


0.33


43.78


0.008


11


Рыбинск


0.65


101.42


0.006


62


Электросталь


0.25


51.45


0.005


52



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

Город


Общая площадь парков (м2)


Кол-во м2 парков на 1 жителя


Количество жителей на 1 парк


Калуга


12,600,000


37.95


2372


Зеленоград


4,130,000


16.49


9633


Кострома


3,950,000


14.26


5539


Химки


3,550,000


13.68


9613


Владимир


4,620,000


12.94


3432


Воронеж


8,250,000


9.72


2050


Москва


121,750,000


9.60


8630


Тамбов


2,710,000


9.28


2087


Липецк


4,440,000


8.72


6531


Тула


4,090,000


8.61


4658


Рязань


4,320,000


8.01


5618


Коломна


1,030,000


7.35


6673


Курск


3,310,000


7.31


525


Ярославль


3,680,000


6.05


3457


Королёв


970,000


4.32


7478


Подольск


1,290,000


4.19


5814


Красногорск


690,000


3.93


8360


Рыбинск


650,000


3.52


2978


Балашиха


1,780,000


3.51


9225


Муром


330,000


3.08


9726


Тверь


1,380,000


3.07


3485


Люберцы


600,000


2.92


7332


Мытищи


530,000


2.25


7850


Электросталь


250,000


1.60


3001



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





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

Город


Рейтинг


Место


Владимир


12


1


Калуга


15


2


Москва


18


3


Зеленоград


21


4


Тамбов


23


5


Красногорск


35


6


Балашиха


39


7


Люберцы


45


8


Химки


46


9


Курск


47


10


Коломна


48


11


Кострома


50


12


Воронеж


52


13


Подольск


55


14


Тула


55


15


Рязань


61


16


Тверь


63


17


Ярославль


63


18


Муром


69


19


Рыбинск


69


20


Липецк


70


21


Королёв


75


22


Мытищи


75


23


Электросталь


94


24



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


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

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

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

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

Ведущий Frontend-разработчик, Инфостандарт — Епифанов Даниил.
Редактор, Инфостандарт — Морозов Никита.
Теги:
Хабы:
Всего голосов 14: ↑14 и ↓0+14
Комментарии12

Публикации

Истории

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань