Поддержка трёхмерного рельефа в MapLibre GL JS основана на использовании цифровых моделей высот (DEM, Digital Elevation Model), которые интерпретируются на стороне клиента и преобразуются в геометрию WebGL-террейна. В отличие от классических тайловых слоёв, содержащих только цветовую информацию, DEM-текстуры кодируют высоту в каждом пикселе, что позволяет динамически деформировать поверхность карты.
Основная концепция рельефа заключается в том, что карта перестаёт быть плоской проекцией и становится трёхмерной сеткой, где каждая вершина соответствует значению высоты.
Для работы рельефа используются специальные растровые тайлы высот:
Наиболее распространены два формата кодирования:
Высота кодируется в RGB-каналах:
[ height = (R ^2 + G + B) - 10000]
Альтернативное кодирование:
[ height = (R + G + ) - 32768]
Такие форматы позволяют хранить высоту с высокой точностью в стандартных PNG-тайлах.
В MapLibre GL JS DEM добавляется как raster-dem
источник:
map.addSource('terrain-source', {
type: 'raster-dem',
url: 'https://demotiles.maplibre.org/terrain-tiles/tiles.json',
tileSize: 512,
encoding: 'mapbox'
});
Ключевые параметры:
type: raster-dem — тип источника высотtileSize — размер тайла, часто 256 или 512encoding — схема кодирования высот (mapbox
или terrarium)После подключения DEM-источника активируется рельеф:
map.setTerrain({
source: 'terrain-source',
exaggeration: 1.5
});
Значение exaggeration влияет на визуальную
выразительность:
1.0 — реальная высота1.5–2.0 — умеренное усиление рельефа>2.5 — стилизованный гипертрофированный рельефРельеф в MapLibre GL JS реализуется через WebGL-сетку, где:
Система использует:
При изменении масштаба выбираются разные уровни детализации DEM, что предотвращает артефакты при наклоне камеры.
Рельеф влияет на все растровые и векторные слои, которые размещаются поверх террейна. При этом слои автоматически «прилипают» к поверхности.
map.addLayer({
id: 'hillshade',
type: 'hillshade',
source: 'terrain-source'
});
hillshade используется для визуального усиления рельефа
за счёт имитации освещения.
Слой hillshade создаёт эффект теней, вычисляемых на основе наклона поверхности:
map.addLayer({
id: 'terrain-shading',
type: 'hillshade',
source: 'terrain-source',
paint: {
'hillshade-exaggeration': 0.5,
'hillshade-shadow-color': '#000000',
'hillshade-highlight-color': '#ffffff'
}
});
Ключевые свойства:
Рельеф становится визуально значимым только при наклоне камеры:
map.easeTo({
pitch: 60,
bearing: -20,
duration: 1000
});
Параметры камеры:
pitch — угол наклонаbearing — поворот картыzoom — масштаб, влияющий на детализацию DEMПри увеличении pitch WebGL начинает активно интерполировать высоты, создавая ощущение объёма.
Качество рельефа определяется несколькими факторами:
Используются методы:
Рельеф является одной из наиболее ресурсоёмких функций MapLibre GL JS.
Основные факторы нагрузки:
Оптимизация достигается через:
tileSizemaxzoom для DEMРельеф тесно взаимодействует с 3D-слоями:
fill-extrusion (3D здания)custom layers (WebGL объекты)map.addLayer({
id: 'buildings-3d',
type: 'fill-extrusion',
source: 'composite',
'source-layer': 'building',
paint: {
'fill-extrusion-height': ['get', 'height'],
'fill-extrusion-base': ['get', 'min_height'],
'fill-extrusion-opacity': 0.9
}
});
Здания автоматически «садятся» на поверхность рельефа при активированном terrain.
Современные стили MapLibre GL JS поддерживают атмосферные эффекты, усиливающие восприятие глубины:
map.setFog({
color: 'rgb(220, 230, 240)',
'horizon-blend': 0.2,
'range': [1, 10]
});
Fog взаимодействует с террейном следующим образом:
В сложных стилях возможно использование нескольких источников высот, например:
Логика выбора осуществляется через приоритет источников в стиле.
Рельеф можно изменять во время работы карты:
map.setTerrain({
source: 'terrain-source',
exaggeration: 2.2
});
Изменение параметра exaggeration приводит к:
Визуальный характер рельефа формируется сочетанием:
Часто применяются стили:
На уровне GPU террейн представляет собой сетку треугольников:
Vertex shader выполняет:
Fragment shader отвечает за:
LOD (Level of Detail) управляет детализацией:
Переход между уровнями происходит плавно через морфинг тайлов.
Пользовательские WebGL-слои могут учитывать высоту рельефа через:
Это позволяет строить:
Система Terrain в MapLibre GL JS состоит из нескольких уровней:
Эта архитектура обеспечивает непрерывную трансформацию плоской карты в интерактивную трёхмерную поверхность с динамической геометрией и адаптивной детализацией.