Raster-dem source

Raster-dem источник в Mapbox GL JS предназначен для работы с растровыми цифровыми моделями рельефа (Digital Elevation Model, DEM). Он используется для загрузки тайлов, содержащих данные высот, и последующего преобразования их в информацию о геометрии местности, применяемую в рендеринге 3D-террейна, теней рельефа и аналитических визуализаций.

Raster-dem слой отличается от обычных raster-тайлов тем, что каждый пиксель кодирует не цвет, а высоту. На уровне Mapbox GL JS такие данные становятся основой для генерации геометрии земли через terrain API и визуальных эффектов, таких как hillshade.

Источник задаётся через type: "raster-dem" в конфигурации карты. Он поддерживает тайлы форматов RGB или Terrarium-encoded DEM, где высота вычисляется из цветовых каналов.

Базовая структура:

map.addSource("terrain-dem", {
  type: "raster-dem",
  url: "mapbox://mapbox.terrain-rgb",
  tileSize: 512,
  maxzoom: 14
});

Ключевые параметры:

  • type — обязательное значение "raster-dem"
  • url — источник тайлов (часто Mapbox Terrain RGB)
  • tileSize — размер тайла, обычно 512 или 256
  • maxzoom — максимальный уровень детализации данных
  • encoding — способ кодирования высот (mapbox или terrarium)

Кодирование высоты в raster-dem

Raster DEM не хранит высоту напрямую. Она кодируется в RGB-каналах изображения.

Mapbox Terrain RGB encoding

В случае стандартного формата Mapbox используется формула:

  • высота в метрах вычисляется так:

[ height = -10000 + ]

Каждый пиксель:

  • R — старший байт
  • G — средний байт
  • B — младший байт

Такое кодирование позволяет хранить отрицательные и положительные значения высот.

Terrarium encoding

Альтернативный формат использует другую схему:

[ height = (R + G + ) - 32768]

Он часто применяется в открытых источниках DEM-тайлов.

Подключение terrain через raster-dem

Raster-dem источник становится полезным только в связке с terrain параметром карты.

map.setTerrain({
  source: "terrain-dem",
  exaggeration: 1.5
});

Параметр exaggeration управляет вертикальным масштабированием рельефа:

  • 1.0 — реальная высота
  • <1.0 — сглаженный рельеф
  • >1.0 — усиление перепадов высот

Использование с hillshade

Raster-dem часто применяется совместно с hillshade слоем для визуализации освещения рельефа.

map.addLayer({
  id: "hillshade-layer",
  type: "hillshade",
  source: "terrain-dem"
});

Hillshade использует производные значения высоты для расчёта освещения:

  • угол солнца
  • направление света
  • затенение склонов

Это позволяет создавать визуально читаемый рельеф даже без текстур.

Ограничения и особенности данных

Raster-dem источники имеют ряд технических ограничений:

1. Разрешение тайлов

Высота интерполируется из пиксельной сетки. При низком zoom уровне возможны:

  • ступенчатые переходы
  • потеря мелких форм рельефа

2. Производительность

DEM-тайлы увеличивают нагрузку на:

  • декодирование RGB → float
  • построение terrain mesh
  • GPU-затенение

Особенно заметно при высоком exaggeration.

3. Пропуски данных

В некоторых регионах:

  • отсутствует высокоточная высота
  • используются усреднённые SRTM данные
  • возможны артефакты в горах и городах

Внутренний процесс обработки raster-dem

При загрузке тайла происходит цепочка преобразований:

  1. Загрузка PNG/JPEG тайла
  2. Декодирование RGB каналов
  3. Преобразование в высоту (float)
  4. Построение mesh-поверхности
  5. Интеграция в terrain-слой карты

Каждый шаг выполняется с использованием WebGL-пайплайна, что позволяет обрабатывать большие массивы данных без CPU-рендеринга.

Использование нескольких DEM источников

Возможна комбинация нескольких raster-dem источников:

map.addSource("local-dem", {
  type: "raster-dem",
  url: "mapbox://custom.local-terrain",
  tileSize: 256
});

Приоритет определяется порядком подключения terrain:

map.setTerrain({
  source: "local-dem",
  exaggeration: 2.0
});

Такой подход применяется для:

  • локальных высокоточных моделей
  • смешивания глобальных и региональных данных
  • кастомных картографических проектов

Взаимодействие с 3D слоями

Raster-dem источник является основой для:

  • fill-extrusion (3D здания)
  • sky layer (небо и атмосфера)
  • 3D-объектов через custom layers

Terrain влияет на все последующие слои, создавая единое пространство координат с высотой.

Кэширование и оптимизация

Mapbox GL JS использует встроенное кэширование DEM тайлов:

  • тайлы сохраняются в memory cache
  • повторные запросы исключаются
  • применяется компрессия сетевых данных

Оптимизационные практики:

  • ограничение maxzoom
  • использование 512px тайлов для баланса качества
  • снижение exaggeration при слабых устройствах

Работа с отсутствием terrain

Если raster-dem источник не подключён, карта остаётся 2D, а:

  • hillshade не работает
  • terrain API игнорируется
  • высотная интерполяция отключена

Это важно учитывать при динамическом переключении режимов карты.