Глава 1. Создание пространственной БД
- О чём эта глава
- Первая глава РГР: сбор данных Всероссийской переписи населения по выбранному региону, их нормализация, загрузка в PostgreSQL, выгрузка административных границ из OpenStreetMap через QuickOSM и соединение статистики с геометрией оператором JOIN.
- Пререквизиты
- Установленное ПО — инструкция по установке. Нормализация — лекция 3; JOIN — экспресс-занятие 3; работа в pgAdmin — практика 3.
- Формат сдачи
- Отчёт присылается в формате doc, docx или pdf. Состав отчёта каждой части — в конце соответствующего раздела; интерактивные чек-листы помогают ничего не забыть (отметки сохраняются в браузере).
Часть 1. Данные переписи населения
Методические указания (как делать)
- Выберите уникальный в пределах вашей группы регион России (за исключением городов федерального значения).
- Зайдите на сайт Росстата и найдите Итоги Всероссийской переписи населения 2020 года. Например, для Нижегородской области: https://52.rosstat.gov.ru/folder/62175#, где 52 — номер региона.
- Скачайте таблицу «Численность населения городских округов, муниципальных районов, муниципальных округов, городских и сельских поселений, городских населённых пунктов, сельских населённых пунктов с населением 3000 человек и более» (номер таблицы может отличаться; формат csv, xlsx, xls).
Пример данных переписи населения для Белгородской области (в отличие от Нижегородской — пункт № 4, название совпадает):
- Откройте скачанный файл и отредактируйте его следующим образом:
- удалите «шапку»;
- удалите строку 4, где указано «А 1 2 3 4 5»;
- удалите колонку «В общей численности населения, процентов»;
- добавьте название первой колонке.
Почему не обязательно хранить данные из удалённой колонки? Как это связано с процессом нормализации данных (лекция 3)?
подсказка
Проценты вычисляются из абсолютных значений («Мужчины и женщины», «Мужчины», «Женщины») делением — это атрибут, выведенный из других атрибутов. Хранение вычислимых значений создаёт избыточность и риск рассогласования при обновлении — именно то, что устраняет нормализация.
- Полученный файл откройте в QGIS (без геометрии).
- Проверьте таблицу атрибутов; переименуйте слой в Rosstat.
Если при открытии файла csv вместо названий регионов стоят «нечитаемые» символы, воспользуйтесь следующей инструкцией:
- Экспортируйте таблицу (слой) в формате PostgreSQL SQL-дамп.
При экспорте проверьте корректность типов данных (люди измеряются в целых числах! Если видите иной тип данных — проверьте таблицу и вернитесь к пункту 6):
- При экспорте в поле «Геометрия» тип геометрии измените на «Без геометрии».
- Создайте БД с именем «ВАШЕФИО_ОБЛ», например «LebedevED_Nizn».
- Импортируйте SQL-дамп (см. гиф): откройте pgAdmin → панель Query Tool → перенесите файл в панель и выполните код.
- Отобразите содержимое таблицы Rosstat.
- Посчитайте, сколько у вас NULL-значений.
- Удалите все строки, содержащие NULL-значения одновременно в трёх колонках.
- Выведите таблицу после удаления.
Состав отчёта: часть 1
- Дайте краткую справку региону, который вы выбрали.
- Опишите данные Росстата, которые вы берёте. Приложите ссылку на сайт Росстата региона.
- Покажите исходную таблицу в Excel (назовите «Рис. 1. Исходные данные»).
- Опишите процесс нормализации таблицы (дополните «Рис. 2. Нормализованная таблица»).
- Опишите, какая таблица была создана в Postgres. Приведите код для создания таблицы и первые 5 вставленных строчек командой INSERT INTO. Назовите это «Листинг 1. Создание и наполнение таблицы {ваше название таблицы}». Соблюдайте цветовую разметку!
CREATE TABLE "public"."rosstat"(); ALTER TABLE "public"."rosstat" ADD COLUMN "ogc_fid" SERIAL CONSTRAINT "rosstat_pk" PRIMARY KEY; ALTER TABLE "public"."rosstat" ADD COLUMN "Название области" VARCHAR; ALTER TABLE "public"."rosstat" ADD COLUMN "Мужчины и женщины" NUMERIC(10,0); ALTER TABLE "public"."rosstat" ADD COLUMN "Мужчины" NUMERIC(10,0); ALTER TABLE "public"."rosstat" ADD COLUMN "Женщины" NUMERIC(10,0); INSERT INTO "public"."rosstat" ("Название области", "Мужчины и женщины", "Мужчины", "Женщины") VALUES ('Нижегородская область', 3119115, 1411929, 1707186);
- Покажите запрос и таблицу в pgAdmin (Листинг 2. Запрос для вывода таблицы; Рис. 3. «Таблица с данными в PostgreSQL»).
- Укажите, сколько NULL-значений существует в таблице (Листинг 3. Запрос для вывода NULL-значений).
- Удалите все строки, содержащие NULL в трёх и более столбцах (Листинг 4. Запрос для удаления пустых строк).
- Рис. 4. Таблица после выполнения запроса.
DELETE FROM your_table_name WHERE "Мужчины и женщины" IS NULL AND "Мужчины" IS NULL AND "Женщины" IS NULL;
Часть 2. Границы из OpenStreetMap
Методические указания (как делать)
- Установите плагин QuickOSM для QGIS для загрузки векторных данных (Модули → Управление модулями → поиск QuickOSM).
- После установки найдите новый инструмент в разделе Вектор → QuickOSM → QuickOSM.
- OSM предполагает запросы с использованием атрибутов. Выберем атрибут admin_level = 6 в границах выбранного вами субъекта РФ.
1. Атрибут admin_level описывает границы на разных административных уровнях — от страны до города. Имеет значения от 2 до 10, где 2 — границы страны, 10 — городских поселений.
2. Если после нажатия на «Выполнить запрос» ничего не произошло — проверьте правильность правописания субъекта РФ!
- Полученные данные загружены как «временные слои». Сохраните их (ПКМ по слою → Сохранить на диск → *.shp или любой иной формат).
- Откройте таблицу атрибутов векторного полигонального слоя.
- Нажмите
для редактирования. - Нажмите
для удаления лишних полей.
- Сохраните изменения, закончив редактирование (нажмите
и сохраните). - Настройте проекцию проекта: выберите подходящую зону Гаусса — Крюгера. Например, для Нижегородской области EPSG:20008 — Pulkovo 1995 / Gauss-Kruger zone 8.
- Проведите операции над линейным и точечным слоем.
- Переименуйте слои: «Границы ИМЯ_СУБЪЕКТА_РФ», «Районы ИМЯ_СУБЪЕКТА_РФ» и «Административные центры ИМЯ_СУБЪЕКТА_РФ».
- Экспортируйте все данные в формате SQL-дампа.
- Загрузите данные подобно прошлому заданию (пункт 10 части 1).
- Выполните запрос, использовав JOIN для соединения таблиц Rosstat и «Районы ИМЯ_СУБЪЕКТА_РФ»:
SELECT * FROM ROSSTAT JOIN "Районы ИМЯ_СУБЪЕКТА_РФ" ON ROSSTAT.name = "Районы ИМЯ_СУБЪЕКТА_РФ".name
- Визуализируйте результат (оранжевый — результат запроса, бежевый — все районы):
Почему не получилось «соединить» все данные?
подсказка
JOIN сопоставляет строки по точному совпадению названий, а написание районов в файле Росстата и в OSM отличается: «Городской округ город Бор» против «городской округ Бор», буква ё, кавычки, сокращения. Строки без точного совпадения в результат INNER JOIN не попадают.
- Откройте ранее скачанный файл Росстата и сформируйте новую таблицу на его основе:
- выберите только районы из списка «Районы ИМЯ_СУБЪЕКТА_РФ»;
- обратите внимание, что в файле Росстата имена могут отличаться — скорректируйте их;
- городское и сельское население вынесите в отдельные таблицы;
- для районов используйте OSM_ID.
Пример:
- Полученные таблицы сохраните в формате .csv (.xlsx, .xls).
Состав отчёта: часть 2
- Напишите характеристику порталу OSM. Опишите, какие данные там можно получить.
- Укажите параметры запроса для QuickOSM. Добавьте таблицу с описанием значений admin_level. Добавьте «Рис. 5. Результаты запроса».
- Добавьте запрос для вывода векторного слоя районов субъекта РФ (Листинг 5). Покажите результат запроса.
- Объясните операцию JOIN. Укажите, по какому атрибуту производится соединение и почему. Добавьте запрос в виде Листинга 6. Добавьте визуализацию всех районов субъекта РФ и результатов соединения.
- Объясните, почему возникла проблема. Опишите принципы нормализации ко 2НФ. Таблицы «Общее население», «Городское население» и «Сельское население» вставьте в конец файла и назовите «Приложение А.1», «Приложение А.2», «Приложение А.3» соответственно.
Часть 3. Соединение и картографирование
Методические указания (как делать)
- Загрузите *.csv с населением по вашему субъекту РФ в базу данных (файлы были сделаны в конце прошлой части).
- Для загрузки новых таблиц можно пользоваться «Менеджером БД»:
- Базы данных → Менеджер БД;
- раскройте вашу БД → из списка выберите public (одним щелчком) → затем нажмите Импорт слоя/файла;
- выберите параметры импорта (какой слой, в какую базу данных, как назвать таблицу).
- Отобразите полученные таблицы при помощи запроса SELECT и выведите как слои QGIS.
- Чтобы соединить таблицу с векторным слоем, нажмите ПКМ по «Районы ИМЯ_СУБЪЕКТА_РФ»: выберите вкладку «Связи», нажмите на «+», установите связь между слоем и таблицей по атрибуту OSM_ID.
- В поле «Присоединяемые поля» выберите все поля, кроме OSM_ID.
- Повторите операцию для всех трёх таблиц (Общее население, Городское население, Сельское население).
- Измените стиль отображения слоя, подобрав шкалу:
- выведите сформированный слой при помощи оператора JOIN;
- нажмите ПКМ по слою и перейдите в раздел «Свойства»;
- выберите вкладку «Стиль».
- Измените стиль отображения с «Простой символики» на «Символизация по диапазонам значений».
- Настройте карту для отображения общего состава населения.
- Шкалу и количество классов настройте по своему усмотрению, исходя из правил картографического отображения (методы классификации разобраны в практике 9).
- Перейдите во вкладку «Диаграммы» (ПКМ по слою → Свойства → Диаграммы):
- выберите «Круговая диаграмма»;
- нажмите на ε и вычислите долю городского населения (поделите городское население на общее и умножьте на 100);
- нажмите на ε и вычислите долю сельского населения (аналогично);
- подберите контрастные цвета для отображения.
- При необходимости настройте размер круговых диаграмм (никакая диаграмма не должна выходить за пределы границ районов).
Пример — фрагмент карты Нижегородской области:
- Проведите компоновку карты.
- Проект → Менеджер макетов → Создать → «Область Фамилия».
- Добавьте карту на холст (холст направьте горизонтально или вертикально в зависимости от протяжённости области).
- Добавьте рамку.
- Добавьте герб региона. Добавьте масштаб.
- Итоговый макет экспортируйте в изображение.
Состав отчёта: часть 3
- Опишите все атрибуты внутри ваших таблиц в формате:
Таблица "Рейсы" Код рейса (первичный ключ) Номер рейса (Числовой, длинное целое) Аэропорт вылета (Текстовый, 20) Аэропорт назначения (Внешний ключ, ссылается на таблицу "Аэропорты назначения") Продолжительность полета (Временной) Цена билета (Денежный, в рублях)
- В виде схемы отобразите соединения между имеющимися таблицами (можно воспользоваться сервисом dbdiagram.io). Представьте в виде «Рис. 6».
- Покажите таблицу атрибутов слоя «Районы ИМЯ_СУБЪЕКТА_РФ» после соединения.
- Из документации QGIS выпишите, чем отличаются алгоритмы формирования шкал. Посмотрите, какой из алгоритмов и со сколькими классами вам подойдёт. Полученную шкалу «округлите»: ступень от 999 до 1793 целесообразно для лучшего восприятия превратить в «от 1000 до 1800» (или от 1000 до 2000).
- Дайте «Рис. 7», «Рис. 8» и «Рис. 9» для иллюстрации разных параметров автоматической генерации.
- Приведите итоговую шкалу и карту на «Рис. 10».
- Полученную карту проанализируйте (есть ли закономерности в распределении населения?). Опишите результаты пространственного анализа.
- Добавьте «Рис. 11» — карту с картодиаграммами соотношения городского населения. Проведите пространственный анализ посредством визуального изучения.
- Сделайте запрос к БД, который сформирует таблицу с долями городского и сельского населения по административным районам. Добавьте эту таблицу в «Приложение А.4».
- «Рис. 12» — добавьте итоговый макет. Укажите масштаб.
Контрольные вопросы
-
admin_level кодирует уровень административных границ от 2 (границы страны) до 10 (городские поселения). Для муниципальных районов субъекта РФ используется admin_level = 6; для границ самих субъектов — admin_level = 4.
-
Соединение идёт по текстовому полю name, а написание районов в двух источниках различается (сокращения, «ё», регистр, порядок слов). Строки без точного совпадения выпадают. Лечение: скорректировать имена в таблице Росстата и перейти на устойчивый ключ — OSM_ID.
-
В исходной таблице Росстата одна строка смешивает разные уровни агрегации (всё население, городское, сельское) — это повторяющиеся группы и частичные зависимости. Разнесение по таблицам с ключом OSM_ID приводит данные ко второй нормальной форме (2НФ): каждый факт зависит от полного ключа своей таблицы.
-
Ничем по существу — она выполняет то же соединение M:1 по ключевому полю, но через графический интерфейс и без записи результата в базу: присоединённые поля видны в таблице атрибутов слоя, пока настроена связь.
-
Таблица переписи — атрибутивная, геометрии в ней нет; выбор «Без геометрии» создаёт обычную таблицу. Типы проверяются, потому что численность населения должна быть целочисленной: если QGIS распознал колонку как текст или дробное число, агрегаты и сравнения будут работать неверно.
-
Карта области с картограммой населения и круговыми диаграммами долей городского/сельского населения, рамка, герб региона, масштаб; ориентация холста подбирается под протяжённость области. Макет экспортируется в изображение.
Источники
- Итоги Всероссийской переписи населения 2020 года — Росстат : [сайт]. — URL: https://rosstat.gov.ru/vpn_popul (дата обращения: 18.08.2026).
- QuickOSM — QGIS Python Plugins Repository : [сайт]. — URL: https://plugins.qgis.org/plugins/QuickOSM/ (дата обращения: 18.08.2026).
- Карта OpenStreetMap : [сайт]. — URL: https://www.openstreetmap.org (дата обращения: 18.08.2026).
- dbdiagram.io — Database Relationship Diagrams Design Tool : [сайт]. — URL: https://dbdiagram.io/d (дата обращения: 18.08.2026).