Средства анализа геоданных: карты изменений, оконные функции и TimeManager
- О чём это занятие
- Продолжение демографического проекта: от статичных карт по годам — к картам изменений и анимации. Инструменты: оконные функции LAG и LEAD в SQL, симметричная классификация «вокруг нуля» в QGIS и модуль TimeManager, собирающий годы в GIF-анимацию.
- Аннотация
- Разминка возвращает к нормализации: таблица студенческих групп с перечислением предметов через запятую разбивается на две связанные, и по ним пишется JOIN-запрос с диапазоном лет. Основная линия — карты изменений населения. Сначала разность 1992 к 1991 году строится двойным соединением и оконной функцией LAG в конструкции WITH; вводится симметричная классификация вокруг нуля с расходящейся цветовой шкалой — карта честно показывает, где население росло, а где убывало. Затем — систематическое знакомство с оконными функциями: окно-партиция, LAG и LEAD, принципиальное отличие PARTITION BY от GROUP BY, которое закрепляется интерактивным сравнением. Запрос обобщается на весь период 1992–2019 одной оконной функцией. Финал — анимация: настройка модуля TimeManager, экспорт кадров, сборка GIF онлайн-сервисами, а также компоновка результата с фиксацией карты и картой-врезкой региона.
- Пререквизиты
- Практика 7 — построенные слои населения по годам; оконные функции в теории — демонстрация LAG в главе 2 РГР.
- Материалы к занятию
- База с таблицами «субъекты_РФ» и «Численность_населения» из практики 7; QGIS с модулем TimeManager.
1. Повторение: что не так с таблицей?
Дана таблица: ID, Year_in, Group, Subjects — где Subjects хранит списки «Биология, Химия», «Литература, История» и т. п. Что с ней не так и как исправить?
показать разбор
Нарушена 1НФ: в столбце Subjects несколько значений. Разбиение на две таблицы:
| ID | Year_in | Group |
|---|---|---|
| 1 | 2020 | A |
| 2 | 2021 | B |
| 3 | 2022 | C |
| 4 | 2019 | D |
| 5 | 2023 | E |
| ID | GROUP_ID | Subject |
|---|---|---|
| 1 | 1 | Биология |
| 2 | 1 | Химия |
| 3 | 2 | Литература |
| 4 | 2 | История |
| 5 | 3 | Компьютерные науки |
| 6 | 3 | Математика |
| 7 | 4 | Физика |
| 8 | 4 | Химия |
| 9 | 5 | История |
| 10 | 5 | Искусство |
Напишите запрос: выберите группы с 2019 по 2021 год и список предметов.
показать решение
SELECT g."Group", g.year_in, gs.subject FROM groups g JOIN group_subjects gs ON g.id = gs.group_id WHERE g.year_in BETWEEN 2019 AND 2021;
2. Карта изменений: 1992 к 1991 году
Статичные карты по годам из практики 7 почти неотличимы друг от друга. Гораздо интереснее карта изменений — разность населения между соседними годами. Запрос с конструкцией WITH и оконной функцией LAG:
WITH population_diff AS ( SELECT sr.geom, TO_DATE(cn.field_1, 'YYYY') AS "Год", -- преобразуем строку в дату CAST(NULLIF(cn.field_3, '') AS NUMERIC) AS "Население", CAST(NULLIF(cn.field_3, '') AS NUMERIC) - LAG(CAST(NULLIF(cn.field_3, '') AS NUMERIC)) OVER (PARTITION BY sr.geom ORDER BY TO_DATE(cn.field_1, 'YYYY')) AS "Разница" FROM public."субъекты_РФ" AS sr JOIN public."Численность_населения" AS cn ON sr.name = cn.field_2 WHERE cn.field_1 IN ('1991', '1992') ) SELECT * FROM population_diff WHERE "Год" = TO_DATE('1992', 'YYYY');
Разбор приёмов: NULLIF заменяет пустые строки на NULL (иначе CAST упадёт); CAST … AS NUMERIC превращает текст в число; LAG берёт население предыдущего года того же субъекта (PARTITION BY sr.geom, ORDER BY год); внешний SELECT оставляет только строки 1992 года, у которых разность уже вычислена.
2.1. Симметричная классификация
Для слоя изменений: ПКМ → Свойства → Стиль → символизация по диапазонам значений; значение — «Разница»; равные классы; симметричная классификация — вокруг 0; 10 классов; расходящаяся цветовая шкала.
3. Оконные функции
Оконные функции в SQL — особый класс функций, позволяющий производить вычисления по определённым группам строк в базе данных. При этом они не объединяют строки в одну, а возвращают столько же, сколько было на входе. Оконная функция работает с выделенным набором строк — окном (партицией) — и выполняет вычисление для этого набора в отдельном столбце. Партиция — набор строк, указанный для оконной функции по одному из столбцов или группе столбцов таблицы; партиции для каждой оконной функции в запросе могут быть разделены по различным колонкам.
LAG и LEAD возвращают значение выражения, вычисленного для предыдущей (LAG) или следующей (LEAD) строки результирующего набора; PARTITION BY группирует строки по значению определённого столбца.
3.1. Интерактив: GROUP BY против PARTITION BY
Одна и та же таблица населения двух регионов за три года — и два способа посчитать «среднее по региону». Переключайте режимы и следите за числом строк.
3.2. Запрос для всех годов
Оконная функция избавляет от ручного перебора лет — одна конструкция считает разности для всего периода:
SELECT sr.geom, cn.field_1 AS "Год", CAST(NULLIF(cn.field_3, '') AS NUMERIC) AS "Население", CAST(NULLIF(cn.field_3, '') AS NUMERIC) - LAG(CAST(NULLIF(cn.field_3, '') AS NUMERIC)) OVER (PARTITION BY sr.geom ORDER BY cn.field_1) AS "Разница" FROM public."субъекты_РФ" AS sr JOIN public."Численность_населения" AS cn ON sr.name = cn.field_2 WHERE cn.field_1 BETWEEN '1992' AND '2019' ORDER BY sr.geom, cn.field_1;
4. Модуль TimeManager
Time Manager — инструмент в QGIS, который позволяет использовать ползунок времени для фильтрации наборов данных и отображения изменений во времени.
- Включение: Модули → TimeManager → Toggle visibility.
- Настройка: Add layer (добавить слой) → Layer (выбираем слой) → Start Time (столбец начала) → End Time (столбец конца).
Экспорт GIF напрямую возможен на Linux или при установке специализированного ПО на Windows — однако на всех системах можно экспортировать набор кадров! Кадры затем собираются в GIF любым онлайн-сервисом, например: maker-gif.com, image.online-convert.com, omnifile.pages.dev.
5. Компоновка
- Создайте макет (Проект → Менеджер макетов → создать) и разместите карту.
- Для перемещения изображения внутри рамки используйте инструмент «Перемещение содержимого»; не забудьте вернуться из этого режима.
- Настройте масштаб «Карты» в свойствах элемента.
- Настройте рамку «Карты».
- Зафиксируйте карту «замочком» (галочка под замком) — элементы перестанут случайно сдвигаться.
Карта-врезка. Вернитесь в основное окно QGIS, добавьте слой с вашим регионом и уберите видимость слоя с картой РФ; затем в макете добавьте «Карту 2» — она покажет текущее состояние основного окна. Так на одном листе соседствуют обзорная карта страны и крупный план региона.
6. Домашнее задание
Скачать и изучить данные Росстата по валовому продукту региона, занести таблицу в БД после нормализации данных и визуализировать данные на 2020 год — это вход в главу 2 РГР, где та же связка «ST_Touches + LAG + TimeManager» применяется к динамике ВВП вашего региона и его соседей.
Контрольные вопросы
-
Численность из CSV сохранилась текстом, среди значений есть пустые строки. NULLIF(поле, '') превращает пустую строку в NULL (иначе CAST упадёт с ошибкой), CAST(... AS NUMERIC) делает из текста число, с которым можно вычитать и сравнивать.
-
Для каждой строки — население того же субъекта (партиция по геометрии) в предыдущем по порядку году. Разность текущего значения и LAG даёт изменение «год к году»; у первого года партиции LAG возвращает NULL.
-
GROUP BY с агрегатами сокращает число строк, сворачивая каждую группу в одну строку. Оконная функция с PARTITION BY сохраняет все строки исходной таблицы и дописывает вычисленное по окну значение в отдельный столбец.
-
Символизация по диапазонам значений, равные классы, симметричная классификация вокруг 0, ~10 классов, расходящаяся цветовая шкала. Ноль — содержательная граница между убылью и ростом: симметричные ступени кодируют и знак, и величину изменения.
-
Экспортировать набор кадров (это работает на всех системах), а затем собрать их в GIF онлайн-сервисом (maker-gif.com, image.online-convert.com и т. п.). Прямой экспорт GIF доступен на Linux или при установке специализированного ПО.
-
Add layer → выбрать слой → указать Start Time (столбец с началом периода, для годовых данных — дата года, полученная to_date/TO_DATE) и End Time. После этого ползунок времени фильтрует объекты по выбранному моменту.
-
Фиксация защищает настроенный элемент от случайных сдвигов при доработке макета. Врезка: в основном окне включить только слой региона, затем в макете добавить «Карту 2» — она отобразит текущее состояние окна; на листе получаются обзорная карта и крупный план.
Источники
- PostgreSQL 15 Documentation. Window Functions : [сайт]. — URL: https://www.postgresql.org/docs/15/tutorial-window.html (дата обращения: 18.08.2026).
- TimeManager — QGIS Python Plugins Repository : [сайт]. — URL: https://plugins.qgis.org/plugins/timemanager/ (дата обращения: 18.08.2026).
- QGIS Documentation. Print Layout : [сайт]. — URL: https://docs.qgis.org/3.34/ru/docs/user_manual/print_composer/ (дата обращения: 18.08.2026).