[API, Геоинформационные сервисы, Визуализация данных, Инфографика] Кому на Руси жить хорошо? Как мы искали самый “зеленый” город с помощью OpenStreetMap и Overpass API

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
24-Сен-2020 17:31

У каждой карты есть легенда: именно она говорит читателю о том, что и каким образом на ней обозначено. Домам соответствуют многоугольники серого цвета, дорогам — отрезки и кривые, территории парков и скверов заливаются светло-зеленым и украшаются пиктограммой дерева. А к некоторым картам добавляют полезное приложение — список этих самых дорог с протяженностью, количество парков, лавочек и мусорных урн.
Когда мы готовились к автоматизации работы местных муниципальных служб, мы обратили внимание на использование картографии, которое мы сочли действительно мощным и эффективным инструментом для решения широкого кластера задач. На карте можно отображать актуальную информацию о местоположении объектов, маршруты движения уборочной техники, транспорта, план работы и тепловую карту с проблемными и “здоровыми” участками.
Использование картографии в целом помогает ускорить время реакции и принятия решений по экстренным вопросам, упрощает процесс планирования и прогнозирования, а главное — вся информация доступна в максимально наглядном виде.
В ходе работы с одним из заказчиков перед нами возникла интересная задача — подсчитать количество объектов на карте по категориям.
Найти
Определить самый “зеленый” город в ЦФО по совокупности следующих данных: количество лавочек, урн и парков.
Дано
Картография. В качестве плацдарма мы выбрали 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-разработчик, Инфостандарт — Епифанов Даниил.
Редактор, Инфостандарт — Морозов Никита.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_api, #_geoinformatsionnye_servisy (Геоинформационные сервисы), #_vizualizatsija_dannyh (Визуализация данных), #_infografika (Инфографика), #_osm, #_overpass, #_geoinformatsionnye_servisy (геоинформационные сервисы), #_webrazrabotka (web-разработка), #_kartografija (картография), #_analiz_dannyh (анализ данных), #_api, #_geoinformatsionnye_servisy (
Геоинформационные сервисы
)
, #_vizualizatsija_dannyh (
Визуализация данных
)
, #_infografika (
Инфографика
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 11-Май 01:07
Часовой пояс: UTC + 5