Поддержка трёхмерного рельефа в Mapbox GL JS основана на использовании цифровых моделей высот (Digital Elevation Model, DEM). Рельеф формируется путём «вытягивания» растровых тайлов высот, что позволяет преобразовывать плоскую карту в динамическую 3D-поверхность без перехода к полноценному WebGL-движку трёхмерной сцены.
Ключевая концепция заключается в том, что геометрия тайлов карты остаётся двумерной, но каждая точка дополнительно получает высотную компоненту, задаваемую DEM-источником.
Для построения рельефа используется тип источника
raster-dem. Такой источник содержит закодированную
информацию о высоте в каждом пикселе тайла.
map.addSource('mapbox-dem', {
type: 'raster-dem',
url: 'mapbox://mapbox.mapbox-terrain-dem-v1',
tileSize: 512,
maxzoom: 14
});
Основные характеристики DEM-слоя:
Mapbox Terrain DEM оптимизирован для плавного перехода между уровнями масштабирования и минимизации артефактов на границах тайлов.
Активация 3D-рельефа выполняется через метод setTerrain,
который связывает карту с DEM-источником.
map.setTerrain({
source: 'mapbox-dem',
exaggeration: 1.5
});
Параметр exaggeration управляет вертикальным масштабированием:
1.0 — реальные высоты без искажений;Геометрически это реализуется как умножение высотной компоненты вершин при построении сетки тайлов.
При включении рельефа каждый тайл карты проходит дополнительную стадию обработки:
В результате формируется непрерывная триангулированная поверхность, которая визуально воспринимается как ландшафт.
Особенность реализации заключается в том, что тесселяция происходит на стороне GPU, что позволяет сохранять высокую производительность даже при больших зумах.
Рельеф сам по себе задаёт геометрию поверхности, но визуальное восприятие формируется слоями карты.
hillshade используется для имитации освещения рельефа и
усиления восприятия глубины.
map.addLayer({
id: 'hillshading',
source: 'mapbox-dem',
type: 'hillshade'
});
Особенности hillshade:
Параметры освещения позволяют варьировать угол солнца и интенсивность затенения, что влияет на читаемость рельефа.
Для повышения реалистичности сцены используется слой
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);
При увеличении угла наклона:
Работа с рельефом предъявляет дополнительные требования к GPU и памяти.
Основные ограничения:
exaggeration;Оптимизационные механизмы включают:
Рельеф может изменяться в реальном времени без пересоздания карты:
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
}
}
Такая структура позволяет включать рельеф на уровне стиля без дополнительной логики в коде приложения.
При включённом рельефе все растровые и векторные слои автоматически «приклеиваются» к поверхности.
Особенности поведения:
Для корректного отображения важно учитывать
fill-extrusion, который может конкурировать с terrain при
визуализации 3D-объектов.
При работе с рельефом возникают специфические визуальные дефекты:
Швы между тайлами
tileSize и использованием
сглаживания.Ступенчатость высот
Пересвет hillshade
Наиболее устойчивые визуальные конфигурации рельефа формируются при совместном использовании:
terrain для геометрии;hillshade для освещения;sky для атмосферы;Такое сочетание формирует непрерывную сцену, где данные высот, освещение и перспектива работают как единая система визуализации.