Статьи
ГИС Туториалы

Показываем данные в QGIS с помощью цвета и размера одновременно на карте с гексагонами

Время прочтения: 5 минут
Версия QGIS в статье: 3.28
Уровень владения QGIS: для тех, кто уже имеет небольшой опыт в QGIS: умеет добавлять слои на карту и ориентируется в инструментах обработки

Введение

Показывать как можно больше информации используя как можно меньшее количество элементов — естественное желание как картографов, так и людей, занимающихся визуализацией данных. Существуют различные способы показать два значения на одной карте, и одно из самых эффективных это градуирование значения по цвету и размеру одновременно. И если в ArcGIS это сделать довольно легко, используя стандартные стили, то в QGIS это сделать сложнее, и для этого потребуются две вещи, которые часто нужны для решения задач в этой программе: смекалочка и генератор геометрии.
Создание карт, показывающих два значения одновременно в ArcGIS возможно буквально двумя кнопками, никакой изобретательности. Еще и решили назвать это «smart mapping» (Источник – https://www.esri.com/arcgis-blog/wp-content/uploads/2017/04/Color-and-Size-Options-_boxes.png)

Подготовка

В сегодняшнем уроке мы будем делать карту, которая одновременно будет показывать плотность пабов на душу населения, а также их количество.
Перед тем как начать делать карту, нужно подготовить данные, которые я для этой статьи взял из следующих источников:
  1. Все пабы в Англии с Kaggle, доступные по ссылке.
  2. Гексагоны с численностью населения на территорию Соединенного Королевства от Kontur.
Так выглядят слои: гексагоны с численностью населения и точки пабов (на базовой карте OpenStreetMap)
Подготовка данных для карты будет заключаться в следующем:
  1. Мы создадим для слоев пространственные индексы, чтобы все процессы были быстрее.
  2. Удалим гексагоны, в которых нет пабов, чтобы ускорить вычислительные процессы и не отвлекаться на них в будущем.
  3. Соберем данные о количестве пабов в наш слой с гексагонами.
  4. Посчитаем плотность пабов на душу населения.
После этих этапов мы сможем приступить к настройке стилей, которая, как это часто бывает, займет меньше времени, чем подготовка данных.

Шаг 1. Пространственные индексы

В этой статье я не буду заострять внимание на том, что такое пространственные индексы. Достаточно знать, что они ускоряют любые процессы, если нам приходится взаимодействовать с двумя слоями сразу. Если вы хотите узнать про пространственные индексы больше, то у нас есть про это небольшая статья.
Чтобы создать пространственный индекс, нажимаем правой клавишей на слой, выбираем «Свойства слоя», затем вкладку «Текст» и ищем фразу «Создать пространственный индекс». Выполняем эту операцию как для слоя с пабами, так и для слоя с гексагонами.

Шаг 2. Удаляем лишние гексагоны

В этом шаге мы удалим все гексагоны, в которых нет ни одного паба. Воспользуемся для этого инструментом «Выбрать по расположению»:
Настройки на скрине позволяют выбрать объекты из слоя с гексагонами, которые пересекаются с объектами из слоя с пабами. QGIS способен делать это даже со слоями в разных системах координат, но для верности лучше, чтобы слои были в одной.
После того, как мы выбрали все объекты, которые пересекаются с пабами, сохраняем их в новый слой.

Шаг 3. Соберем данные о количестве пабов в слой с гексагонами

У нас есть слой с пабами и слой с гексагонами, которые пересекаются с пабами. Давайте посчитаем, сколько пабов в каждом гексагоне. Для этого воспользуемся инструментом «Объединение атрибутов по расположению (сводка)». Найти его можно на панели инструментов.
Устанавливаем параметры как на скрине и получаем временный слой с гексагонами, в которых посчитано количество пабов. Во вкладке «Поля для сводки» можно выбрать любое поле, если мы используем в «Рассчитать сводки» функцию «Всего».
Подсчет количества пабов займет какое-то время, нужно лишь подождать. После него получим временный слой гексагонов с количеством пабов, который необходимо сохранить, чтобы не потерять данные и использовать при создании карты.
Временный слой, в котором подсчитано количество пабов в каждом гексагоне

Шаг 4. Рассчитаем плотность пабов

Чтобы рассчитать плотность пабов, просто разделим колонку, содержащую количество пабов на население — в моем случае на то, сколько тысяч человек населения проживает в гексагоне.
Через калькулятор геометрии создаем поле с плотностью и считаем по формуле на экране плотность пабов на 1000 человек. Я выбрал тип поля «Целое», чтобы не смотреть на дроби. Даже если при расчете получится 0, то мы знаем, что хотя бы один паб в гексагоне есть, но на него приходится слишком много человек, чтобы этот гексагон претендовал на самый пьющий в Соединенном Королевстве.

Визуализация гексагонов по цвету и размеру

Теперь самое время приступить к настройке стилей нашей карты. В свойствах слоя во вкладке «Стиль слоя» ищем «Тип слоя». Выбираем тип «Генератор геометрии» и устанавливаем следующий код:
CASE
WHEN   "fas_id_count"  <= 1 THEN  buffer( $geometry, -400)
WHEN "fas_id_count" > 20 THEN $geometry
ELSE buffer( $geometry, -200)
END

Как работает этот код

«fas_id_count» — это колонка, которая содержит количество объектов, и именно от количества объектов мы будем устанавливать размер гексагонов.
Наш код устанавливает условия, каким будет размер гексагона при каком количестве пабов, и делает это с помощью отрицательного буфера. Когда мы используем функцию buffer и устанавливаем в ней отрицательные значения, то программа строит фигуру, которая уменьшает ее на установленное количество метров (не перепутайте с градусами, если работаете с градусными системами координат).
Самый большой отрицательный буфер, то есть самое сильное уменьшение, ставим для наименьших значений. Все остальное делаем с небольшим уменьшением, чтобы знаки визуально отличались.
Получаем вот такие гексагоны разных размеров
Теперь самое время настроить цвет стилей. Для этого в свойствах слоя в графе «Стиль слоя» вместо «Простая заливка» устанавливаем «Символизация по диапазонам значений». В поле «значение» ставим колонку, в которой содержится информация о плотности пабов на душу населения и выбираем понравившийся градиент.
Не забудьте про выбор классификации значений, но при желании прямо в этом окне вы можете выставить значения вручную. Главное помните, что если нажмете на кнопку «Классифицировать», то все собьется. Ну и конечно не забываем, что у нас есть статья про алгоритмы классификации данных.
Теперь добавим немного стиля. Открываем свойства слоя, затем выбираем стиль слоя, после чего нажимаем на поле «Знак». Важно, чтобы у вас не был выделен ни один из классов, иначе изменения затронут только символику отдельного класса, а не всех значков класса. Выставляем настройки для обводки полигонов как на скрине, и теперь гексагоны будут иметь обводку такого же цвета, что и заливку полигона. Таким образом, когда самые большие гексагоны будут соседствовать, между ними не будет никаких щелей.
Теперь можно добавить подложку (базовую карту) с помощью плагина QuickMapServices, в данном случае я выбрал Dark Matter от CartoDB (она есть в стандартных подложках), а также, чтобы она была видна для слоя с гексагонами, установил прозрачность 50 %.
Итоговая карта, которую вы можете повторить с любыми данными на любой территории в один из дней 30DayMapChallenge этого года

Благодарности

Написать эту статью меня вдохновил пост на канале преподавателя курсов по QGIS в Картетике Ольги Гоммерштадт. В нем она рассказывает о своем способе построения карт, который я описал в этой статье. На мой взгляд он более академический и чуть сложнее. Так, что если хотите расширить свой кругозор и прокачать свое мастерство, то можете подписать на ее канал или записаться на курс «Введение в QGIS», если вы еще новичок, или «Продвинутый QGIS», если вы уже достаточно пощелкали мышкой в нашем любимом открытом программном обеспечении.
Материал подготовил Александр Зуев