В основе рендеринга MapLibre GL JS лежит WebGL, где каждый пиксель формируется с учётом альфа-канала. Прозрачность в этом контексте — это не единая настройка, а совокупность параметров, влияющих на смешивание (blending) фрагментов в каждом слое карты.
Ключевая особенность модели: каждый слой управляет собственной прозрачностью через paint-свойства, а итоговая картинка формируется в порядке от нижних слоёв к верхним.
MapLibre GL JS использует стандартный альфа-композитинг:
Формально смешивание можно представить как:
C_{out} = _s C_s + (1 - _s) C_d
где:
Важно: в WebGL часто используется premultiplied alpha, что влияет на интерпретацию значений при кастомных шейдерах и источниках данных.
Каждый тип слоя имеет собственное свойство opacity, которое управляет прозрачностью геометрии и заливки.
Используется для полигонов:
map.setPaintProperty('land', 'fill-opacity', 0.6);
Особенности:
Для линий применяется:
map.setPaintProperty('road', 'line-opacity', 0.4);
Дополнительно доступны:
line-colorline-widthline-dasharrayПрозрачность влияет на толщину визуального восприятия сети дорог, маршрутов и границ.
map.setPaintProperty('points', 'circle-opacity', 0.8);
Используется для точечных данных:
map.setPaintProperty('labels', 'text-opacity', 0.7);
map.setPaintProperty('labels', 'icon-opacity', 0.7);
Особенность symbol-слоёв — раздельная прозрачность текста и иконок, что позволяет независимо управлять читаемостью и визуальной плотностью.
map.setPaintProperty('satellite', 'raster-opacity', 0.5);
Применяется к тайлам изображений:
map.setPaintProperty('heat', 'heatmap-opacity', 0.6);
Часто используется совместно с:
heatmap-weightheatmap-intensityheatmap-radiusДля 3D-моделей и неба:
map.setPaintProperty('buildings-3d', 'fill-extrusion-opacity', 0.7);
map.setPaintProperty('sky', 'sky-opacity', 0.5);
Opacity в MapLibre GL JS может зависеть от масштаба, свойств объектов и любых выражений стиля.
map.setPaintProperty('roads', 'line-opacity', [
'interpolate',
['linear'],
['zoom'],
5, 0.2,
10, 0.8
]);
Логика:
map.setPaintProperty('points', 'circle-opacity', [
'case',
['>', ['get', 'importance'], 5],
1,
0.3
]);
Такой подход используется для:
MapLibre поддерживает плавные изменения paint-свойств:
map.setPaintProperty('land', 'fill-opacity-transition', {
duration: 300,
delay: 0
});
Итог:
Прозрачность не является изолированным параметром — она зависит от порядка рендеринга.
При сложных стилях часто возникает эффект многослойного затемнения, особенно при большом количестве перекрывающихся полигонов.
Дополнительно к WebGL-прозрачности существует уровень DOM:
.map-container {
opacity: 0.5;
}
Особенности:
Причина: применяется после рендеринга WebGL-контента.
При работе с прозрачностью возникают характерные эффекты:
Особенно заметно при:
Прозрачность влияет не только на визуал, но и на производительность.
Рекомендации:
visibility при полном
скрытииmap.setPaintProperty('areas', 'fill-opacity', [
'case',
['==', ['get', 'id'], selectedId],
1,
0.2
]);
map.setPaintProperty('background', 'fill-opacity', 0.3);
map.setPaintProperty('focus-layer', 'fill-opacity', 0.9);
map.setPaintProperty('points', 'circle-opacity', [
'case',
['boolean', ['feature-state', 'hover'], false],
1,
0.4
]);
map.setPaintProperty('data-layer', 'fill-opacity', 0);
map.setPaintProperty('data-layer', 'fill-opacity-transition', {
duration: 500
});
map.setPaintProperty('data-layer', 'fill-opacity', 0.8);
Opacity часто путается с visibility:
map.setLayoutProperty('layer-id', 'visibility', 'none');
Комбинация подходов: