Практики · занятие 8

Средства анализа геоданных: карты изменений, оконные функции и 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 несколько значений. Разбиение на две таблицы:

IDYear_inGroup
12020A
22021B
32022C
42019D
52023E
IDGROUP_IDSubject
11Биология
21Химия
32Литература
42История
53Компьютерные науки
63Математика
74Физика
84Химия
95История
105Искусство
Разминка

Напишите запрос: выберите группы с 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 классов; расходящаяся цветовая шкала.

Настройка симметричной классификации вокруг нуля
Карта изменений населения
Почему «вокруг 0»? Ноль — содержательная граница: слева от него убыль, справа рост. Симметричные ступени с расходящейся шкалой (красный ↔ синий/зелёный) кодируют и знак, и величину изменения; обычная классификация смешала бы «слабый рост» и «слабую убыль» в один класс (подробнее — глава 2 РГР).

3. Оконные функции

Оконные функции в SQL — особый класс функций, позволяющий производить вычисления по определённым группам строк в базе данных. При этом они не объединяют строки в одну, а возвращают столько же, сколько было на входе. Оконная функция работает с выделенным набором строк — окном (партицией) — и выполняет вычисление для этого набора в отдельном столбце. Партиция — набор строк, указанный для оконной функции по одному из столбцов или группе столбцов таблицы; партиции для каждой оконной функции в запросе могут быть разделены по различным колонкам.

LAG и LEAD возвращают значение выражения, вычисленного для предыдущей (LAG) или следующей (LEAD) строки результирующего набора; PARTITION BY группирует строки по значению определённого столбца.

Отличие GROUP BY от PARTITION BY При использовании агрегирующих функций предложение GROUP 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, который позволяет использовать ползунок времени для фильтрации наборов данных и отображения изменений во времени.

  1. Включение: Модули → TimeManager → Toggle visibility.
  2. Настройка: Add layer (добавить слой) → Layer (выбираем слой) → Start Time (столбец начала) → End Time (столбец конца).
Настройка TimeManager

Экспорт GIF напрямую возможен на Linux или при установке специализированного ПО на Windows — однако на всех системах можно экспортировать набор кадров! Кадры затем собираются в GIF любым онлайн-сервисом, например: maker-gif.com, image.online-convert.com, omnifile.pages.dev.

Экспорт кадров TimeManager

5. Компоновка

  1. Создайте макет (Проект → Менеджер макетов → создать) и разместите карту.
  2. Для перемещения изображения внутри рамки используйте инструмент «Перемещение содержимого»; не забудьте вернуться из этого режима.
  3. Настройте масштаб «Карты» в свойствах элемента.
  4. Настройте рамку «Карты».
  5. Зафиксируйте карту «замочком» (галочка под замком) — элементы перестанут случайно сдвигаться.
Настройка масштаба и рамки карты

Карта-врезка. Вернитесь в основное окно QGIS, добавьте слой с вашим регионом и уберите видимость слоя с картой РФ; затем в макете добавьте «Карту 2» — она покажет текущее состояние основного окна. Так на одном листе соседствуют обзорная карта страны и крупный план региона.

Карта-врезка региона

6. Домашнее задание

Скачать и изучить данные Росстата по валовому продукту региона, занести таблицу в БД после нормализации данных и визуализировать данные на 2020 год — это вход в главу 2 РГР, где та же связка «ST_Touches + LAG + TimeManager» применяется к динамике ВВП вашего региона и его соседей.

Контрольные вопросы

Источники

  1. PostgreSQL 15 Documentation. Window Functions : [сайт]. — URL: https://www.postgresql.org/docs/15/tutorial-window.html (дата обращения: 18.08.2026).
  2. TimeManager — QGIS Python Plugins Repository : [сайт]. — URL: https://plugins.qgis.org/plugins/timemanager/ (дата обращения: 18.08.2026).
  3. QGIS Documentation. Print Layout : [сайт]. — URL: https://docs.qgis.org/3.34/ru/docs/user_manual/print_composer/ (дата обращения: 18.08.2026).