Terrain и рельеф местности

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

Ключевая концепция заключается в том, что геометрия тайлов карты остаётся двумерной, но каждая точка дополнительно получает высотную компоненту, задаваемую DEM-источником.


DEM-источники и структура данных высот

Для построения рельефа используется тип источника raster-dem. Такой источник содержит закодированную информацию о высоте в каждом пикселе тайла.

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

Основные характеристики DEM-слоя:

  • хранение высот в виде RGB-или float-кодированных значений;
  • поддержка масштабирования по зуму;
  • интерполяция высот между тайлами;
  • использование в качестве глобальной поверхности.

Mapbox Terrain DEM оптимизирован для плавного перехода между уровнями масштабирования и минимизации артефактов на границах тайлов.


Включение рельефа через setTerrain

Активация 3D-рельефа выполняется через метод setTerrain, который связывает карту с DEM-источником.

map.setTerrain({
  source: 'mapbox-dem',
  exaggeration: 1.5
});

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

  • значение 1.0 — реальные высоты без искажений;
  • значения > 1 усиливают рельеф;
  • значения < 1 визуально сглаживают поверхность.

Геометрически это реализуется как умножение высотной компоненты вершин при построении сетки тайлов.


Рендеринг поверхности и тесселяция тайлов

При включении рельефа каждый тайл карты проходит дополнительную стадию обработки:

  1. загрузка растрового DEM;
  2. декодирование высотных значений;
  3. построение сетки треугольников;
  4. смещение вершин по оси Z;
  5. применение матриц камеры и проекции.

В результате формируется непрерывная триангулированная поверхность, которая визуально воспринимается как ландшафт.

Особенность реализации заключается в том, что тесселяция происходит на стороне GPU, что позволяет сохранять высокую производительность даже при больших зумах.


Комбинация рельефа с визуальными слоями

Рельеф сам по себе задаёт геометрию поверхности, но визуальное восприятие формируется слоями карты.

Hillshade слой

hillshade используется для имитации освещения рельефа и усиления восприятия глубины.

map.addLayer({
  id: 'hillshading',
  source: 'mapbox-dem',
  type: 'hillshade'
});

Особенности hillshade:

  • вычисление освещённости на основе нормалей поверхности;
  • моделирование направления солнца;
  • усиление контрастов склонов;
  • отсутствие влияния на геометрию.

Параметры освещения позволяют варьировать угол солнца и интенсивность затенения, что влияет на читаемость рельефа.


Sky layer и интеграция с атмосферой

Для повышения реалистичности сцены используется слой sky, который формирует небесный купол.

map.addLayer({
  id: 'sky',
  type: 'sky',
  paint: {
    'sky-type': 'atmosphere',
    'sky-atmosphere-sun': [0.0, 0.0],
    'sky-atmosphere-sun-intensity': 10
  }
});

Взаимодействие рельефа и атмосферы создаёт визуальную связку между высотой и освещением сцены. Особенно заметен эффект на больших масштабах наклона камеры.


Камера и восприятие высоты

Рельеф становится полноценным только при использовании наклонной камеры (pitch) и вращения (bearing).

map.setPitch(60);
map.setBearing(-20);

При увеличении угла наклона:

  • усиливается эффект глубины;
  • становятся видимыми перепады высот;
  • возрастает значимость hillshade;
  • проявляется ступенчатость DEM при низком разрешении.

Ограничения и особенности производительности

Работа с рельефом предъявляет дополнительные требования к GPU и памяти.

Основные ограничения:

  • увеличенный объём данных при загрузке DEM;
  • рост нагрузки на видеокарту при высоком exaggeration;
  • возможные артефакты на границах тайлов при низком зуме;
  • необходимость WebGL 2.0 для оптимальной производительности.

Оптимизационные механизмы включают:

  • кеширование тайлов;
  • адаптивную детализацию;
  • ограничение максимального зума DEM;
  • упрощение сетки на дальних расстояниях.

Динамическое изменение рельефа

Рельеф может изменяться в реальном времени без пересоздания карты:

map.setTerrain({
  source: 'mapbox-dem',
  exaggeration: 2.0
});

Изменение параметров приводит к перерасчёту высотной сетки на GPU, что позволяет анимировать ландшафтные эффекты, например:

  • визуальное усиление горных массивов;
  • плавное «раскрытие» рельефа при переходе между режимами;
  • комбинирование с анимацией камеры.

Интеграция с источниками данных и стилями

Рельеф не является самостоятельным слоем, а интегрируется в стиль карты через конфигурацию style JSON.

{
  "version": 8,
  "sources": {
    "mapbox-dem": {
      "type": "raster-dem",
      "url": "mapbox://mapbox.mapbox-terrain-dem-v1"
    }
  },
  "terrain": {
    "source": "mapbox-dem",
    "exaggeration": 1.2
  }
}

Такая структура позволяет включать рельеф на уровне стиля без дополнительной логики в коде приложения.


Взаимодействие с другими слоями

При включённом рельефе все растровые и векторные слои автоматически «приклеиваются» к поверхности.

Особенности поведения:

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

Для корректного отображения важно учитывать fill-extrusion, который может конкурировать с terrain при визуализации 3D-объектов.


Типичные артефакты и способы их уменьшения

При работе с рельефом возникают специфические визуальные дефекты:

Швы между тайлами

  • проявляются на низких зумах;
  • устраняются увеличением tileSize и использованием сглаживания.

Ступенчатость высот

  • результат низкого разрешения DEM;
  • компенсируется интерполяцией и уменьшением exaggeration.

Пересвет hillshade

  • возникает при агрессивных параметрах освещения;
  • корректируется углом солнца и интенсивностью.

Практика комбинирования эффектов

Наиболее устойчивые визуальные конфигурации рельефа формируются при совместном использовании:

  • terrain для геометрии;
  • hillshade для освещения;
  • sky для атмосферы;
  • наклон камеры для восприятия глубины.

Такое сочетание формирует непрерывную сцену, где данные высот, освещение и перспектива работают как единая система визуализации.