DEM: цифровая модель рельефа

Урок про цифровую модель рельефа (DEM) — растр, в каждой ячейке которого хранится высота над уровнем моря.

DEM (Digital Elevation Model) — растр, где значение каждой ячейки это высота поверхности над уровнем моря в этой точке.

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

DEM как матрица высот

Возьмём маленький DEM $4 \times 4$ (высоты в метрах) и вытащим базовую статистику: минимум, максимум, перепад высот и среднее. Это типичная первая операция при анализе рельефа:

dem = [
    [120, 122, 125, 130],
    [121, 126, 132, 138],
    [123, 130, 140, 150],
    [125, 135, 148, 162],
]

flat = [h for row in dem for h in row]
lo, hi = min(flat), max(flat)
mean = sum(flat) / len(flat)
print(f"Минимум высоты: {lo} м")
print(f"Максимум высоты: {hi} м")
print(f"Перепад: {hi - lo} м")
print(f"Средняя высота: {mean:.1f} м")

Вывод:

Минимум высоты: 120 м
Максимум высоты: 162 м
Перепад: 42 м
Средняя высота: 132.9 м

Профиль высот вдоль линии

Часто нужен профиль — как меняется высота вдоль маршрута. Для строки или столбца DEM это просто срез матрицы. Возьмём диагональ и посмотрим набор высоты:

dem = [
    [120, 122, 125, 130],
    [121, 126, 132, 138],
    [123, 130, 140, 150],
    [125, 135, 148, 162],
]
diagonal = [dem[i][i] for i in range(len(dem))]
print("Профиль по диагонали:", diagonal)

gain = sum(max(0, diagonal[i+1] - diagonal[i])
           for i in range(len(diagonal) - 1))
print(f"Суммарный набор высоты: {gain} м")

Вывод:

Профиль по диагонали: [120, 126, 140, 162]
Суммарный набор высоты: 42 м

Как работает под капотом

DEM собирают разными способами: радарной съёмкой со спутников (миссия SRTM покрыла почти всю сушу с шагом 30 м), лазерным сканированием (LiDAR — точность до сантиметров) или стереопарами снимков. Важно различать DEM (модель земной поверхности без объектов), DSM (с зданиями и деревьями) и DTM (только грунт). Хранят DEM в GeoTIFF, читают через rasterio как массив. В реальном анализе матрицы перемалывают numpy за один проход, но логика тех же срезов и сравнений, что мы написали на чистом Python.

Частые ошибки

  • Игнорировать nodata. Ячейки без данных часто помечены $-9999$; включив их в min/среднее, получите чушь.
  • Путать DEM и DSM. Если в высоту попали деревья и дома (DSM), «рельеф» окажется бугристым там, где земля ровная.
  • Забывать про разрешение. На DEM с шагом 30 м не разглядеть овраг шириной 5 м — он просто усреднится.

Где DEM встречается в инженерии

Цифровая модель рельефа — не академическая абстракция, а рабочий инструмент целых отраслей. Гидрологи по DEM строят направление стока: вода в каждой ячейке «течёт» к самому низкому соседу, и, прослеживая эти связи, восстанавливают русла рек и границы водосборных бассейнов задолго до выезда на местность. Строители считают по DEM объёмы выемки и насыпи грунта: разница между проектной и фактической поверхностью, умноженная на площадь ячейки, сразу даёт кубометры земляных работ. Связисты и военные решают по DEM задачу видимости (viewshed): видна ли точка А из точки Б, не закрывает ли её холм, — это анализ профиля высот вдоль луча зрения. Энергетики оценивают по уклону и экспозиции склонов потенциал солнечных и ветровых станций. Во всех этих случаях исходный материал один — матрица высот, а различаются лишь операции над ней.

Отдельно стоит сказать про точность по вертикали. У DEM есть не только горизонтальное разрешение (размер ячейки), но и вертикальная погрешность — насколько правдиво записана сама высота. У глобального SRTM она около нескольких метров, у LiDAR — сантиметры. Для расчёта затопления при подъёме воды на полметра DEM с погрешностью в метр бесполезен: ошибка больше эффекта. Поэтому первый вопрос к любому DEM — не «какой шаг ячейки», а «какая вертикальная точность и под какую задачу её хватает».

Итог

  • DEM — растр высот; рельеф удобно хранить именно сеткой.
  • Базовая статистика и профиль — это операции среза по матрице.
  • Различают DEM (грунт), DSM (с объектами) и DTM (только земля).
  • Учитывайте nodata и разрешение — иначе анализ исказится.
Проверьте себя
1. Что хранится в ячейке DEM?
AЦвет пикселя
BВысота поверхности над уровнем моря
CНазвание района
DТип дороги
2. Чем DEM отличается от DSM?
AНичем
BDEM — поверхность без объектов, DSM включает здания и деревья
CDEM хранит цвет, DSM — высоту
DDSM меньше по размеру
3. Почему важно учитывать значение nodata в DEM?
AОно красивое
BЯчейки без данных (например -9999) исказят минимум и среднее, если их не отфильтровать
CNodata ускоряет расчёт
DОно не влияет