Мат. моделирование / ДЗЗ
Практика 5

Продвинутая работа с конструктором моделей

О чём эта тема

Как собрать несколько алгоритмов QGIS в один переиспользуемый инструмент — конструктор моделей — на примере автоматического выделения береговой линии.

Аннотация

Тема показывает, как объединить в одну модель QGIS шаги, которые в практиках 2 и 3 выполнялись вручную: расчёт индекса через калькулятор растров, построение изолиний и отбор нужных контуров. Разбирается устройство конструктора моделей — входные данные и узлы-алгоритмы, берущие данные либо из входов, либо из выхода предыдущего узла, — и алгоритм «Извлечь по выражению» с условием по длине контура ($length), который автоматически убирает шумовые контуры (островки, лужи), заменяя ручную чистку результата векторизации из Практики 3. После изучения темы студент сможет собрать модель из нескольких алгоритмов, объяснить, зачем нужен порог по длине контура, и подобрать этот порог с учётом единиц измерения системы координат слоя.

Пререквизиты
  • Практика 2 — калькулятор растров, индекс NDWI
  • Практика 3 — векторизация бинарного растра, изолинии
Мотивация

Ручное повторение одних и тех же шагов обработки для каждого нового снимка — источник ошибок и потерянного времени. Модель, однажды собранная и проверенная, работает одинаково на любых входных данных того же типа и её можно передать коллеге вместе с файлом проекта.

Практика 5. Продвинутая работа с конструктором моделей

Презентация

В практиках 2 и 3 расчёт индекса, векторизация и отбор нужных объектов выполнялись вручную: калькулятор растров → изолинии → выборка объектов, шаг за шагом, каждый раз заново. Если ту же последовательность нужно повторить для другого снимка, другой даты или другой территории — придётся кликать всё то же самое ещё раз. Конструктор моделей QGIS решает эту задачу: он собирает несколько алгоритмов в один инструмент, который запускается одной кнопкой и всегда выполняет шаги в одинаковом порядке.

От ручных шагов к конструктору моделей

Конструктор моделей открывается через Анализ → Конструктор модели (или Ctrl+Alt+G).

путь к конструктору моделей: меню «Анализ» → «Конструктор модели»
Рис. П5.1 — путь к конструктору моделей: меню «Анализ» → «Конструктор модели»

Модель строится из входных данных (растровые и векторные слои, числа, системы координат — они добавляются один раз и потом доступны всем узлам модели) и узлов-алгоритмов, каждый из которых берёт данные либо из входов, либо из выхода предыдущего узла. Такая модель, в отличие от разовой последовательности кликов, сохраняется как файл и может быть запущена повторно на других данных или передана другому человеку.

Собираем модель: от индекса до линии берега

Соберём модель из трёх узлов, повторяющую то, что в Практике 3 делалось вручную, — только теперь одним запуском.

Вход: два растровых слоя — NIR и GREEN.

Узел 1. Калькулятор растров. Считает индекс по формуле (GREEN − NIR) / (GREEN + NIR):

выражение калькулятора растров внутри модели: (A − B) / (A + B), где A — GREEN, B — NIR
Рис. П5.2 — выражение калькулятора растров внутри модели: (A − B) / (A + B), где A — GREEN, B — NIR

О названии индекса

В исходных материалах практики результирующий слой назван «MNDWI», но формула использует каналы GREEN и NIR — это в точности индекс NDWI (Практика 3), а не формально иной индекс MNDWI (Modified NDWI), который строится по GREEN и SWIR. Здесь и далее слой называется NDWI, чтобы не путать эти два индекса.

Узел 2. Создать изолинии. Берёт выход калькулятора растров и строит контуры с шагом 0,2:

диалог алгоритма «Создать изолинии»: исходный слой — выход калькулятора растров, расстояние между изолиниями — 0,2
Рис. П5.3 — диалог алгоритма «Создать изолинии»: исходный слой — выход калькулятора растров, расстояние между изолиниями — 0,2

Узел 3. Извлечь по выражению. Берёт выход алгоритма «Создать изолинии» и разделяет контуры на две группы по условию — длиннее и короче 200 000 (в единицах системы координат слоя):

диалог «Извлечь по выражению» с выделенными полями: выражение, извлечённые и неподходящие объекты
  • Выражение — условие отбора: $length > 200000
  • Извлечено (по выражению) — имя слоя для контуров, прошедших условие: это и есть искомая береговая линия
  • Неподходящие объекты — необязательное имя слоя для отброшенных коротких контуров (шум); можно оставить пустым

Рис. П5.4 — диалог алгоритма «Извлечь по выражению» с выделенными ключевыми полями

Целиком цепочка выглядит так:

Вход
NIR
GREEN
Калькулятор растров
(GREEN − NIR) / (GREEN + NIR)
Создать изолинии
шаг 0,2
Извлечь по выражению
$length > 200000
Result

Рис. П5.5 — цепочка узлов конструктора моделей — от исходных каналов до отфильтрованной береговой линии

Типичная ошибка

Если промежуточному результату узла не задать имя в поле «Результат расчёта» / «Изолинии» и т.п., конструктор моделей не сохранит его как отдельный слой — тогда следующий узел не сможет взять его на входе через выпадающий список «взять с выхода алгоритма». Имя обязательно только у тех результатов, которые нужно передать дальше по цепочке или получить на выходе модели.

Результат запуска модели на снимках Азовского моря — векторная линия берега без ручного вмешательства:

результат работы модели: извлечённая линия берега поверх исходного растра
Рис. П5.6 — результат работы модели: извлечённая линия берега поверх исходного растра

Зачем нужен порог по длине контура

В Практике 3 после векторизации оставалось предупреждение: автоматическая векторизация создаёт контуры не только по береговой линии, но и вокруг внутренних водоёмов, островков и шумовых пятен — их приходилось убирать вручную. Узел «Извлечь по выражению» с условием $length > N делает то же самое автоматически: настоящая береговая линия обычно намного длиннее любого шумового артефакта, поэтому порог по длине отделяет одно от другого без ручной чистки.

Ниже — интерактивная модель этого шага на синтетическом (не измеренном) поле: длинная береговая линия и несколько коротких шумовых контуров. Подвиньте порог и посмотрите, какие контуры выражение $length > N сохраняет, а какие отбрасывает.

Интерактив

Лаборатория порога по длине контура

Слева — синтетическое поле после классификации. Справа — контуры, которые выдал бы алгоритм «Создать изолинии», раскрашенные по результату фильтра «Извлечь по выражению».

Поле после классификации
Контуры после фильтра
"$length" > 0

оставлено (длинный контур) отфильтровано как шум

Типичная ошибка

Число в условии $length > N осмысленно только в единицах системы координат слоя. Для проекции в метрах (например, UTM) 200 000 — это 200 км, разумный порог для береговой линии протяжённого участка побережья. Если слой в географической системе координат (градусы), то же число 200 000 отфильтрует вообще все контуры — перед подбором порога стоит проверить единицы измерения системы координат слоя.

Мини-практикум: угадать выражение по результату

Задание 1. Ниже — результат классификации слоя MNDWI (см. пояснение выше про название индекса) по некоторому порогу. Какое выражение калькулятора растров дало этот результат?

результат классификации по индексу с некоторым порогом — граница вода/суша на побережье Азовского моря
Рис. П5.7 — результат классификации по индексу с некоторым порогом — граница вода/суша на побережье Азовского моря

Задание 2. Ниже — исходный канал Green и результат некоторого выражения над ним.

исходный канал Green — яркие пятна соответствуют облакам
Рис. П5.8 — исходный канал Green — яркие пятна соответствуют облакам
результат выражения над каналом Green: жёлтый — одно значение, чёрный — другое
Рис. П5.9 — результат выражения над каналом Green: жёлтый — одно значение, чёрный — другое

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

Соберите собственную модель из тех же трёх узлов (калькулятор растров → создать изолинии → извлечь по выражению) для снимка другой территории или другой даты. Подберите порог длины контура $length > N самостоятельно и обоснуйте выбор: почему именно это число, а не в 10 раз меньше или больше, — с учётом единиц измерения системы координат вашего слоя.

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