Освещение в MapLibre GL JS является частью стилевой спецификации
карты и влияет на визуальное восприятие трёхмерных объектов, прежде
всего слоёв типа fill-extrusion, а также компонентов,
реагирующих на направление света. В отличие от традиционных 2D-карт, где
визуализация ограничена плоской геометрией, здесь появляется возможность
формировать глубину, объём и контраст за счёт управления параметрами
источников света.
Система освещения описывается через объект light в стиле
карты и поддерживает два основных типа источников:
ambient и directional.
В спецификации стиля MapLibre GL JS освещение задаётся на верхнем уровне:
{
"light": {
"anchor": "viewport",
"color": "#ffffff",
"intensity": 0.5
}
}
Дополнительно, при необходимости имитации направленного света:
{
"light": {
"anchor": "map",
"color": "#ffffff",
"intensity": 0.8,
"position": [1.15, 210, 30]
}
}
Ключевые параметры:
map или viewport)Ambient-свет представляет собой равномерное фоновое освещение, которое не имеет направления и воздействует одинаково на все поверхности. Его основная задача — предотвращение полной потери деталей в тенях.
Характерные особенности:
Пример конфигурации:
{
"light": {
"color": "#d0d0d0",
"intensity": 0.3
}
}
Directional-свет имитирует удалённый источник (например, солнце). Его ключевая особенность — параллельные лучи и выраженная зависимость освещённости от ориентации поверхностей.
Параметр position задаётся в виде массива:
"position": [azimuth, polar_angle, altitude]
Пример:
{
"light": {
"anchor": "map",
"intensity": 0.9,
"position": [1.2, 200, 45]
}
}
Наиболее заметное влияние освещения проявляется в слоях
fill-extrusion, используемых для отображения зданий и
других объёмных объектов.
map.addLayer({
id: "buildings",
type: "fill-extrusion",
source: "composite",
"source-layer": "building",
paint: {
"fill-extrusion-height": ["get", "height"],
"fill-extrusion-base": ["get", "min_height"],
"fill-extrusion-color": "#aaa",
"fill-extrusion-opacity": 0.9
}
});
Освещение влияет на:
При изменении угла направленного света одна и та же геометрия может визуально «поворачиваться» в пространстве за счёт перераспределения теней.
При использовании:
"anchor": "map"
свет фиксируется относительно карты. При вращении или наклоне камеры направление света остаётся стабильным в географическом пространстве.
Это приводит к эффекту:
При использовании:
"anchor": "viewport"
свет фиксируется относительно экрана пользователя. При вращении карты свет «следует» за камерой.
Особенности:
MapLibre GL JS позволяет изменять параметры освещения в реальном
времени через setLight.
map.setLight({
anchor: "map",
intensity: 0.7,
position: [1.5, 180, 60]
});
Применения:
Изменение параметра position позволяет моделировать
движение солнца:
Типичный сценарий анимации:
Параметр intensity регулирует силу освещения:
1.0 — усиленный контраст и резкость
Чрезмерные значения приводят к:
Цвет влияет на общую атмосферу сцены:
Пример:
{
"light": {
"color": "#ffe0b2",
"intensity": 0.6,
"position": [1.3, 210, 50]
}
}
Система освещения MapLibre GL JS имеет ряд архитектурных ограничений:
Освещение применяется на этапе рендеринга как параметр шейдинга, а не как полноценная 3D-сцена с трассировкой лучей.
Освещение влияет не на все типы слоёв:
fill-extrusionbackground, skyline, symbol,
circleЭто связано с тем, что только экструзионные и небесные слои имеют нормали поверхности, необходимые для расчёта освещённости.
При работе с плотной застройкой освещение используется как инструмент визуального разделения:
Изменение угла света способно существенно менять восприятие одного и того же района без изменения данных.
При динамическом наклоне и вращении камеры освещение может:
Комбинация параметров камеры (pitch,
bearing) и light.anchor формирует итоговую
визуальную модель сцены, где свет либо подчёркивает рельеф, либо
стабилизирует композицию независимо от навигации.