Лекции · конспект 8 из 9

Растровые данные в PostGIS

О чём эта тема
Вторая половина мира геоданных — растры в базе данных: загрузка снимков и моделей рельефа утилитой raster2pgsql, тайлы и их индексация, обрезка и объединение, растеризация и векторизация, статистика по каналам и алгебра растров на примере NDVI.
Аннотация
Конспект начинается с типа raster: каждый растр содержит один или несколько каналов со значениями пикселей. Подробно разобрана утилита командной строки raster2pgsql — от расположения исполняемого файла до всех ключевых параметров; интерактивный конструктор собирает команду загрузки по выбранным флагам и объясняет каждый из них. Дальше — что происходит внутри базы: представления raster_columns и raster_overviews, нумерация тайлов rid, выпуклая оболочка тайла и знакомая по лекции 3 задача пространственной индексации. Практический блок на данных SRTM и Landsat 8 показывает пересечение растра с вектором, обрезку ST_Clip, объединение ST_Union и обе стороны преобразования растр—вектор с их принципиальными потерями. Аналитическая часть: метаданные и статистика (ST_SummaryStats с группировкой, ST_Histogram, ST_Quantile), извлечение каналов ST_Band, значения в точке ST_Value, уклон ST_Slope, переклассификация ST_Reclass, индекс топографической позиции и алгебра растров с вычислением NDVI через выражение и через функцию обратного вызова. Завершают конспект справочные списки функций: статистика, доступ к каналам и пространственные отношения между растрами.
Пререквизиты
Лекция 3 (GiST-индексация), лекция 4 (SRID и системы координат), практика 4 (векторные геометрии PostGIS). Работа с raster2pgsql упоминалась и в контексте вопросов к зачёту № 17 и 25.
Мотивация
В главе 3 РГР вы обрезали растр плотности населения по границе региона в QGIS — мышкой. Теперь представьте, что таких регионов восемьдесят пять, снимков — за двадцать лет, и всё это нужно пересчитывать каждый месяц. Ручная работа исключена: растры загружаются в PostGIS, а обрезка, статистика и вычисление индексов становятся SQL-запросами, которые можно автоматизировать. Один запрос — NDVI по всем полям области; второй — средняя высота по каждому району. Это и есть растровый анализ в базе данных.

1. Растр в PostGIS

Растр — это тип пространственных данных, используемый для представления растровых данных, например импортированных из файлов JPEG, TIFF, PNG, цифровых моделей рельефа. Каждый растр содержит один или более каналов, каждый из которых имеет набор значений в пикселях.

Растровые данные: каналы и пиксели
Не забудьте Для работы с растрами необходимо активировать соответствующее расширение — postgis_raster — в дополнение к базовому PostGIS (Extensions → Create → Extension).

2. Загрузка растров с помощью raster2pgsql

raster2pgsql — инструмент командной строки, который поставляется вместе с PostGIS. Если вы работаете в Windows и используете пакет приложений Stack Builder, вы найдёте raster2pgsql.exe в папке C:\Program Files\PostgreSQL\15\bin, где 15 — версия PostgreSQL, которую вы используете.

Расположение raster2pgsql

2.1. Параметры командной строки

При запуске без аргументов raster2pgsql показывает все доступные параметры. Наиболее используемые из них:

Режимы обработки таблиц (взаимоисключающие):

2.2. Пример загрузки

raster2pgsql -s 3763 -N -32767 -t 128x128 -I -C -M -d
  C:\Users\Evgenie\Downloads\Landsat8_L1TP_RGBN.TIF rasters.landsat8
  | psql -d postgis_raster_db -h localhost -U postgres -p 5432

Разбор опций raster2pgsql:

При указании параметра -G raster2pgsql перечисляет все поддерживаемые растровые форматы. Сценарий для загрузки нескольких файлов с разбивкой на тайлы и обзорными уровнями:

raster2pgsql -d -e -l 2,3 -I -C -M -F -Y -t 256x256 *.tif nyc_dem

Чтобы загрузить все файлы одинакового формата из папки, достаточно поставить символ * и через точку добавить расширение.

SQL-запрос, генерируемый raster2pgsql
что делает raster2pgsql: генерируемый запрос

2.3. Конструктор команды raster2pgsql

Соберите свою команду загрузки: отмечайте флаги — команда и пояснения обновляются на лету. Попробуйте воспроизвести пример из раздела 2.2, а затем — сценарий с обзорными таблицами.

Конструктор: raster2pgsql + psql

    

3. Метаданные растров в базе

PostGIS предоставляет два представления растровых каталогов: raster_columns и raster_overviews. Эти представления — часть системы метаданных PostGIS и используются для каталогизации информации о растровых данных в базе (аналогично geometry_columns для векторов — см. практику 4).

Представления raster_columns и raster_overviews

3.1. raster_columns

Каталог всех столбцов типа raster в базе данных. Колонки представления: r_table_catalog (имя текущей базы), r_table_schema (схема), r_table_name (таблица), r_raster_column (растровый столбец), srid (система координат), scale_x и scale_y (масштабы по осям), blocksize_x и blocksize_y (размеры блоков), same_alignment (одинаковое выравнивание), regular_blocking (регулярное блокирование), num_bands (количество каналов), pixel_types (типы пикселей), nodata_values (значения «нет данных»), out_db (хранение вне базы), extent (максимальный охват), spatial_index (наличие пространственного индекса).

3.2. raster_overviews

Каталогизирует информацию о таблицах обзоров (уменьшенных копий растра для быстрого просмотра); информация не дублирует raster_columns. Колонки: o_table_catalog, o_table_schema, o_table_name, o_raster_column — база, схема, таблица и столбец обзора; r_table_catalog, r_table_schema, r_table_name, r_raster_column — растровая таблица, обслуживаемая этим обзором; overview_factor — уровень пирамиды обзора: чем выше число, тем ниже разрешение таблицы.

Общая схема хранения растра в базе: основная таблица со ссылками на таблицу тайлов (rid, raster, filename), таблица систем координат (srid, auth_name, auth_srid, srtext) и обзорные таблицы с overview_factor.

3.3. Плагин raster2postgis в QGIS

Можно обойтись и без консоли: плагин raster2postgis загружает растр на сервер PostgreSQL прямо из QGIS. Работает, только если на сервере установлена утилита raster2pgsql; для первого запуска требуются права суперпользователя, а перед установкой плагина необходимо установить модуль Python unidecode.

Плагин raster2postgis
Окно плагина raster2postgis

4. Тайлы растра и пространственная индексация

Как «увидеть» нарезку на тайлы? Функция ST_ConvexHull вычисляет выпуклую оболочку геометрии — наименьшую выпуклую геометрию, которая окружает все геометрии входного набора. В общем случае выпуклая оболочка является полигоном; для тайла растра это его рамка. Выпуклая оболочка двух и более коллинеарных точек — линия, одной точки — точка.

ST_ConvexHull: рамки тайлов растра

Зачем это нужно? У каждого тайла есть rid: нумерация начинается с верхнего левого угла и заканчивается в правом нижнем.

Нумерация тайлов rid

Каждый тайл имеет координаты своих углов, например POLYGON((293325 6321615, 297165 6321615, 297165 6317775, 293325 6317775)). Возникает знакомый вопрос: как отсортировать данные так, чтобы быстро ответить на пространственный запрос — например, находится ли точка (294325, 6331615) внутри указанной области? Основная проблема в том, что проверять нужно обязательно и координату X, и координату Y — это та самая задача пространственной индексации, которую решают GiST-индексы и кривая Гильберта из лекции 3.

Пример запроса для отображения фрагмента снимка в указанных границах:

SELECT ST_AsTIFF(ST_Union(rast), 'LZW') AS tiff
FROM lc09_l2sp_008021_20240206_20240209_02_t1_sr_b1
WHERE ST_Intersects(
    ST_SetSRID(
        ST_GeomFromText('POLYGON((293325 6321615, 297165 6321615,
                          297165 6317775, 293325 6317775, 293325 6321615))'),
        32621),   -- SRID должен совпадать с системой координат растра
    rast
);

5. Растр и вектор вместе

Входные данные примеров: цифровая модель рельефа SRTM и цветосинтезированное изображение Landsat 8 в формате TIFF (чёрные поля — значение «нет данных»), а также векторные шейп-файлы Португалии: железные дороги (линии), церкви (точки) и округа города Порту (полигоны).

Входные растровые данные: SRTM и Landsat 8
Входные векторные данные Португалии

5.1. Пересечение растра с вектором

CREATE TABLE schema_name.intersects AS
SELECT a.rast, b.municipality
FROM public.dem AS a, vectors.porto_parishes AS b
WHERE ST_Intersects(a.rast, b.geom) AND b.municipality ILIKE 'porto';
Тайлы растра, пересекающие округ Порту

Запрос отбирает тайлы ЦМР, пересекающие границу округа, — но тайлы остаются целыми, с «лишними» краями за границей.

5.2. Обрезка растра по вектору: ST_Clip

CREATE TABLE schema_name.clip AS
SELECT ST_Clip(a.rast, b.geom, true), b.municipality
FROM public.dem AS a, vectors.porto_parishes AS b
WHERE ST_Intersects(a.rast, b.geom) AND b.municipality LIKE 'PORTO';
ST_Clip: растр, обрезанный по границе

Третий аргумент true заполняет области вне полигона значением NoData — растр обрезается точно по границе (так же работала «Обрезка растра по маске» в QGIS в главе 3 РГР).

5.3. Объединение фрагментов: ST_Union

CREATE TABLE schema_name.union AS
SELECT ST_Union(ST_Clip(a.rast, b.geom, true))
FROM public.dem AS a, vectors.porto_parishes AS b
WHERE b.municipality ILIKE 'porto' AND ST_Intersects(b.geom, a.rast);

ST_Union собирает обрезанные тайлы в один непрерывный растр — теперь с ним можно работать как с единым изображением.

ST_Union: объединённый растр

5.4. Растеризация и векторизация

Преобразования между моделями данных несимметричны:

В векторном слое каждый объект имеет собственный уникальный идентификатор; в растровом слое, преобразованном из векторного, каждый объект также должен сохранять свою уникальность.

Схема растеризации и векторизации

Для растеризации PostGIS предоставляет функцию ST_AsRaster. Примеры её применения (в исходных материалах в этих примерах по ошибке повторялся код ST_Clip — здесь приведён корректный вызов по документации PostGIS):

-- пример 1: растеризация полигонов округов по образцу существующего растра
CREATE TABLE schema_name.porto_raster AS
SELECT ST_AsRaster(b.geom, a.rast, '8BUI', 255, 0) AS rast
FROM public.dem AS a, vectors.porto_parishes AS b
WHERE b.municipality ILIKE 'porto' LIMIT 1;

-- пример 2: ST_AsRaster + ST_Union - один растр из всех полигонов
SELECT ST_Union(ST_AsRaster(geom, 100, 100, '8BUI', 255, 0))
FROM vectors.porto_parishes
WHERE municipality ILIKE 'porto';
Результат растеризации ST_AsRaster

6. Анализ растровых изображений

6.1. Метаданные и статистика

Помимо функций для получения метаданных на уровнях растра и канала, PostGIS предоставляет несколько функций для получения информативной статистики о составе и значениях пикселей в канале, которая помогает решить, как обрезать или переклассифицировать растры: ST_Count, ST_CountAgg, ST_Histogram, ST_Quantile, ST_SummaryStats, ST_SummaryStatsAgg и ST_ValueCount.

-- количество пикселей и метаданные
SELECT ST_Count(rast), (ST_MetaData(rast)).* FROM rasters.dem LIMIT 1;
Метаданные растра

6.2. Извлечение канала: ST_Band

Чтобы извлечь один канал из многоканального растра, используется функция ST_Band:

ST_Band: извлечение канала

6.3. Уклон: ST_Slope

ST_Slope — функция PostGIS, которая вычисляет угол наклона для каждого пикселя растрового изображения. Используется для анализа поверхности, например для определения крутизны или уклона ландшафта; угол наклона вычисляется на основе изменения высотных значений цифровой модели рельефа (DEM).

Карта уклонов по ЦМР

6.4. Классификация: ST_Reclass

ST_Reclass — функция переклассификации растровых данных: она изменяет значения пикселей на основе заданных диапазонов или условий. Например, можно заменить пиксели определённого диапазона на другие значения — скажем, преобразовать все значения меньше нуля в ноль.

ST_Reclass: переклассификация растра

6.5. Статистика: ST_SummaryStats

ST_SummaryStats возвращает сводную статистику — количество, сумму, среднее, стандартное отклонение, минимум и максимум — для канала растра. Статистику можно генерировать для каждого тайла или с группировкой:

ST_SummaryStats по тайлам
ST_SummaryStats с группировкой

6.6. Значение пикселя: ST_Value

ST_Value извлекает значение пикселя растра по указанным координатам. Пример: извлечение высот точек из таблицы places по ЦМР.

ST_Value: высоты в точках

6.7. Индекс топографической позиции (TPI)

TPI — переменная второго порядка, позволяющая различать местоположения вдоль профиля склонов: от привершинных (пригребневых) элементарных поверхностей до подножий склонов и прикилевых элементов эрозионной сети.

Индекс топографической позиции

6.8. Алгебра растров: NDVI

Существует два способа использования картографической алгебры в PostGIS: через выражение и через функцию обратного вызова. Классический пример — вычисление вегетационного индекса NDVI по снимку Landsat 8:

NDVI = (NIR − Red) / (NIR + Red)
-- способ 1: выражение (алгебра двух каналов)
CREATE TABLE rasters.ndvi AS
SELECT ST_MapAlgebra(
    rast, 4,          -- канал NIR (в файле RGBN каналы: 1=Red, 2=Green, 3=Blue, 4=NIR)
    rast, 1,          -- канал Red
    '([rast1] - [rast2]) / ([rast1] + [rast2])::float',
    '32BF'
) AS rast
FROM rasters.landsat8;

Способ 2 — функция обратного вызова: создаётся функция schema_name.ndvi с параметрами value (трёхмерный массив значений double precision с данными растров), pos (двумерный массив целых чисел с координатами пикселей) и VARIADIC userargs (параметр переменной длины для произвольного количества дополнительных текстовых аргументов); затем она передаётся в ST_MapAlgebra.

Результат вычисления NDVI

7. Справочник специальных функций

7.1. Статистика

ST_SummaryStats и ST_SummaryStatsAgg
ST_SummaryStats против ST_SummaryStatsAgg

7.2. Доступ к каналам растра

7.3. Пространственные отношения между растрами

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

Источники

  1. PostGIS Documentation. Raster Reference : [сайт]. — URL: https://postgis.net/docs/RT_reference.html (дата обращения: 18.08.2026).
  2. PostGIS Documentation. Loading and Creating Rasters (raster2pgsql) : [сайт]. — URL: https://postgis.net/docs/using_raster_dataman.html (дата обращения: 18.08.2026).
  3. Обе, Р. PostGIS в действии / Р. Обе, Л. Су. — М. : ДМК Пресс, 2022. — 754 с.
  4. Weiss, A. Topographic Position and Landforms Analysis : poster presentation // ESRI User Conference. — San Diego, CA, 2001.