Одна из задач по тематике ГОБУ "Мурманская база авиационной охраны лесов" при тушении лесных пожаров: оптимизация доставки сил и средств наземным транспортом в условиях нескольких проблемных очагов. В качестве примера была реализована ситуация построения кратчайшего маршрута от комплекса зданий ГУ МЧС России по Мурманской области до точки из базы OpenStreetMap, которая наиболее близка к той, что задаёт кликом пользователь как очаг пожара в городе или в окрестных лесах.
Приложение реализовано на языке R с помощью API пакетов shiny и leaflet (также задействованы DBI, RPostgres, dplyr, sf, shinyalert). Средой исполнения служит shiny-сервер. Приложение, хранилища данных и необходимые для их работы компоненты размещены на облачном сервере Amazon Web Services EC2 под управлением Ubuntu 18.04 с 1 Гбайтом оперативной памяти. Версии основных программных компонентов манипулирования данными: PostgreSQL 10, PostGIS 2.4, pgRouting 2.6.2.
Карта содержит следующие объекты:
- Маркеры и тектовые метки для двух точек - начала и конца маршрута.
- Ломаную оптимального маршрута (линия синего цвета).
- Границу фрагмента карты, для которого построена база путей (зелёный прямоугольник).
- Границу фрагмента карты, внутри которого можно выбрать точку - очаг пожара (красный прямоугольник с заливкой).
- Границы и текстовые метки (появляются при наведении курсора мыши) для пригородов с указанием площади.
Справочная информация:
- Все данные взяты из OpenStreetMap (OSM). На момент подготовки данных (март 2019 г.) хранилище OSM для всей России имело объём более 2 Гбайт (архив PBF). Фрагмент для Мурманской области - 35 Мбайт (архив PBF).
- Для создания БД путей файл *.pbf разархивируется в *.osm (утилита osmconvert). В случае Мурманской области - 460 Мбайт. Далее этот объект можно превратить в PostgreSQL БД OSM (утилита osm2pgsql) - 823 Мбайта. Или сразу конвертировать с БД путей с поддержкой pgRouting (утилита osm2pgrouting ) - здесь сервер отказался выполнять конвертацию (похоже 1 Гбайт оперативы сыграл).
- Пришлось задать экстент и уменьшить PBF (тоже osmconvert, экстент: (32.93,68.86,33.5,69.05) - Мурманск и леса к востоку от города). Экстент изображается как объект (3) на карте. Итог: 3 Мбайта в архиве и 32 Мбайта после извлечения в *.osm. Далее БД путей (PostgreSQL c расширениями PostGIS и pgRouting) успешно сформировалась и стала занимать 25 Мбайт.
- Оптимальный маршрут для пары точек строится с помощью pgr_dijkstra из pgRouting - объект (2) на карте.
- Искусственное ограничение БД путей стало приводить к искажениям в итоговом маршруте, поэтому пришлось ограничить и область клика для выбора очага пожара, так появился объект (4).
- Ради эксперимента пригороды Мурманска были извлечены из PostgreSQL БД OSM в отдельный шейпфайл (папка towns), поэтому объекты (5) загружаются из него, а не из БД путей.
Ключевые ссылки: