Разметка и анализ геоданных с использованием QGIS + Python
Доброго времени суток!
На связи Мурачёв Виктор и Князев Платон.
Географические данные (геоданные) это информация о местоположениях объектов, которая может быть собрана через навигационные приборы, камеры, датчики и другие устройства. В настоящее время, в связи с наличием большого количества таких данных, производимых каждую секунду, компании и организации, которые их не используют, рискуют остаться позади в информационной эре.
Геоданные нужны в основном для создания карт. Зачастую разработчики используют их для создания различных сервисов, отслеживания маршрутов, прогнозирования поведения потребителей и решения прочих задач на рассматриваемых территориях.
В том числе, использование такого типа данных помогает в финансовом планировании для предприятий, например, сельскохозяйственного или страхового сектора. Такие предприятия могут оценить риски, сопутствующие с владением землей на той или иной территории, подготовиться к возможным катаклизмам. Географические данные могут помочь в создании инструментов для предсказания будущих тенденций, таких как рост или снижение количества жителей в конкретном регионе, оценка будущих экологических трендов и других важных факторов.
Но несмотря на тот факт, что задачи с анализом такого рода данных возникают довольно часто, необходимой информации для решения задач может быть недостаточно. Так, например, столкнувшись с задачей поиска сельскохозяйственных участков в регионах с повышенной пожароопасностью, мы долгое время не могли найти данные о регионах и адаптировать карты в формате изображений под формат, который можно использовать с Python для глубокого анализа.
В данной публикации нами будет рассмотрено использование бесплатного приложения QGIS для получения координат объектов из карт различного формата. Мы также проведем исследование и полученных данных с использованием модуля GeoPandas для Python, помимо этого, данные будут представлены графически с использование модуля Plotly.
В качестве примера попробуем рассмотреть вхождение районов и областей России в различные климатические зоны, опоясывающие нашу страну:
Территория России находится в четырех климатических поясах: арктический, субарктический, умеренный и тропический. Можно увидеть это разделение на карте. Но для детального анализа этих данных мало изображения в формате .jpg. С помощью приложения QGIS можно наложить изображение на любой участок и, разметив его, получить координаты интересующих объектов на карте.
Первым шагом после несложной установки приложения было создание и выбор формата шаблона карты. В рамках данной задачи будет исследована территорию России. В нашей стране, согласно государственным стандартам, в качестве системы координат допускается использование референсной СК Pulkovo-1942.
Для начала, в приложении QGIS был создан новый проект, где в качестве источника был использован слой карты OpenStreetMap Standard из модуля QuickMapServices:
В свойствах слоя была изменена стандартная система координат на СК, в которой отрисована исследуемая карта (Pulkovo 1942):
Как можно видеть на рисунке снизу, выбор такой системы координат оказался верным. Формат карты очень похож на формат источника:
После выбора СК проекта, необходимо было совместить изображение-источник со слоем карты. Это можно сделать, выбрав пункт «Слои» — «Привязка растров» на панели управления. Откроется меню привязки. После этого можно загрузить растровое изображение исследуемого участка:
Далее изображение было привязано к слою карты по точкам. Для этого достаточно кликнуть на объект в источнике, после чего перейти в слой карты, найти этот объект и кликнуть по нему. В процессе привязки данной карты, мы использовали расположение городов, но приложением допускается использование любых других объектов, например островов, рек или границ:
Чтобы правильно связать объекты, необходимо несколько мест привязки (имеющаяся карта была привязана по 21 позиции). Советую сохранить координаты точек на случай ошибок в работе приложения. Можно запускать процесс привязки:
После успешной привязки, появился новый слой с исходным изображением. Сделав его видимым, мы удостоверились, в корректности совмещения источника и карты:
Если все привязалось правильно, можно переходить к разметке. В ходе решения этой задачи, климатические зоны из источника были размечены вручную. Для этого был использован слой формата ShapeFile, с типом геометрии «Полигон»:
После создания слоя, был активирован режим редактирования и добавлен полигональный объект:
Далее на слой карты были нанесены полигоны, повторяющие климатические зоны из источника. Например, эта часть острова «Северный» находится в арктическом климатическом поясе:
Таким способом были размечены все климатические зоны из источника:
Чтобы продолжить работу с размеченными полигонами, они были сохранены в файл формата .shp – для этого нужно нажать правой кнопкой на слой, выбрать «экспорт» - «сохранить объекты как...». И в открывшемся меню задать путь к файлу и используемую систему координат:
Теперь можно «прочитать» экспортированные полигоны. Эта задача решалась в интерфейсе Jupyter Notebook. Код проекта и все вложения есть в репозитории на GitHub: https://github.com/slowpokalipsis/nta_geo
Для работы с файлами были использованы библиотеки Pandas и GeoPandas для Python:
Теперь полученные полигоны можно отобразить. Для этого были применены возможности библиотеки Plotly:
Для отображения полученной карты используем следующую команду:
Имеем картинку с полигонами климатических зон в границах РФ:
Но самих границ пока нет. В свободном доступе был найден файл с координатами границ и областей РФ. Добавим его:
В функцию для отрисовки, использующей модуль Plotly, добавим код для отображения регионов на карте
Применим новые функции:
Получилась карта, на которой обозначены регионы и климатические зоны:
В рамках ранее упомянутой задачи по поиску сельскохозяйственных участков в регионах с повышенной пожароопасностью, из разных источников был агрегирован набор данных с координатами и кодами всех районов в регионах России. Данные для его создания и скрипты разработки находятся в репозитории. В рамках этой публикации не будет рассмотрен процесс создания и сопоставления данных из разных источников. Используем готовый набор данных:
Полученный набор имеет поля, содержащие название, геометрию (координаты вершин полигона), кадастровый код региона, в котором находится район, код самого района:
Добавим в функцию отрисовки Plotly:
При наведении на карту будет отображаться название выбранного района. Функцию отображения при наведении можно настроить множеством различных способов:
Теперь можно определить, какие районы входят в ту или иную климатическую зону, используя функцию geopandas.geometry.contains():
После анализа данных была выявлена следующая статистика нахождения регионов в климатических зонах:
Абсолютное большинство районов РФ находятся в умеренной климатической зоне. Это 97.95 % районов, что составляет 72.55% от общей площади страны. Перейдем к другому, более показательному примеру.
Возьмем данные об очагах пожаров. Датасет был найден в открытом доступе на сайте DSWorks:
В наборе данных содержатся записи об очагах пожаров с 2012 по 2021 год с координатами и типом пожара:
Совместим эти данные с картой России. Для этого изменим функцию отображения:
Получилось следующее распределение. На карте цветными точками обозначены скопления очагов пожаров – чем больше пожаров, тем темнее:
Попробуем определить самые пожароопасные районы России по соотношению количество пожаров и площади:
В результате анализа данных были выявлены наиболее пожароопасные регионы. В их числе Находкинский, Дальнереченский, Спасск-Дальний, Большой Камень и прочие районы на Дальнем Востоке России:
В результате были решены задачи разметки и анализа данных с помощью QGIS и модуля Geopandas. У обоих утилит, конечно же, есть и другие применения. Например, используя Plotly и GeoPandas, можно находить пересечения объектов, создавать более интерактивные карты с применением, рисовать 3D проекции и прочее.
В ходе решения задач были использованы ресурсы:
Код проекта размещен в репозитории github. Спасибо за внимание.