В MapLibre GL JS работа с цветами строится вокруг спецификации стилей Mapbox Style Specification, где цветовые значения используются в свойствах слоя (paint properties) и задаются в нескольких форматах: строковом, массивном и функциональном.
Поддерживаемые формы задания цвета:
#ff0000, #00ff88#ff000080rgb(255, 0, 0)rgba(255, 0, 0, 0.5)hsl(120, 100%, 50%)hsla(120, 100%, 50%, 0.5)red, blue,
transparentНа уровне спецификации все значения нормализуются во внутреннее представление, что позволяет единообразно использовать их в рендерере независимо от исходного формата.
Цвет в MapLibre GL JS задаётся преимущественно через свойства
paint у слоёв. Каждый тип слоя имеет собственный набор
цветовых параметров.
{
id: 'land',
type: 'fill',
source: 'countries',
paint: {
'fill-color': '#2a9d8f',
'fill-opacity': 0.8
}
}
Основные свойства:
fill-color — цвет заливки полигонаfill-opacity — прозрачность{
id: 'roads',
type: 'line',
source: 'roads',
paint: {
'line-color': '#e76f51',
'line-width': 2
}
}
Особенности:
{
id: 'cities',
type: 'circle',
source: 'points',
paint: {
'circle-radius': 6,
'circle-color': '#264653',
'circle-stroke-color': '#ffffff',
'circle-stroke-width': 1
}
}
Цвет окружности часто используется совместно с обводкой для повышения читаемости на насыщенных подложках.
Одной из ключевых возможностей является использование выражений для динамического вычисления цвета.
Позволяет строить плавные цветовые градиенты:
'fill-color': [
'interpolate',
['linear'],
['get', 'population'],
0, '#edf8fb',
1000, '#b2e2e2',
10000, '#66c2a4',
50000, '#238b45'
]
Смысл:
population определяет цветИспользуется для дискретной классификации:
'circle-color': [
'match',
['get', 'type'],
'capital', '#e63946',
'city', '#457b9d',
'village', '#a8dadc',
'#cccccc'
]
Особенности:
Цвет может зависеть от условий:
'line-color': [
'case',
['>', ['get', 'traffic'], 0.8],
'#d00000',
'#2a9d8f'
]
Прозрачность управляется двумя способами:
'fill-opacity': 0.5
'fill-color': 'rgba(42, 157, 143, 0.5)'
Различие:
Градиенты используются в линиях и заливках для визуализации интенсивности или направления.
'line-gradient': [
'interpolate',
['linear'],
['line-progress'],
0, '#00ff00',
0.5, '#ffff00',
1, '#ff0000'
]
Применяется для:
Цвет часто зависит от свойств геоданных.
'fill-color': [
'interpolate',
['linear'],
['get', 'density'],
0, '#f7fbff',
50, '#c6dbef',
100, '#6baed6',
200, '#2171b5'
]
Используется для:
В практических приложениях цвета часто выносятся в централизованные палитры:
const palette = {
primary: '#1d3557',
secondary: '#457b9d',
accent: '#e63946',
neutral: '#f1faee'
};
Далее используются в стиле:
'background-color': palette.primary
Преимущества:
Цвета могут адаптироваться под тему интерфейса:
'background-color': [
'case',
['==', ['get', 'theme'], 'dark'],
'#0b1320',
'#ffffff'
]
Либо через глобальные параметры приложения, передаваемые в стиль.
Heatmap-слои используют цвет как ключевую метрику плотности:
'heatmap-color': [
'interpolate',
['linear'],
['heatmap-density'],
0, 'rgba(0,0,255,0)',
0.2, 'royalblue',
0.4, 'cyan',
0.6, 'lime',
0.8, 'yellow',
1, 'red'
]
Характеристики:
При построении сложных карт важно учитывать взаимодействие слоёв:
Пример:
'background-color': '#f8f9fa',
'water-color': '#a8dadc',
'road-color': '#e76f51'
Контрастность определяет читаемость карты при различных масштабах.
Цвет может изменяться в зависимости от масштаба:
'fill-color': [
'interpolate',
['linear'],
['zoom'],
5, '#a8dadc',
10, '#457b9d',
15, '#1d3557'
]
Используется для:
Использование сложных выражений цвета влияет на производительность рендеринга:
match вместо сложных
caseВекторный рендеринг MapLibre оптимизирован под GPU, но сложные цветовые вычисления остаются затратными при большом количестве объектов.
rgb(300,0,0))matchЦвет редко используется изолированно. На визуальный результат влияют:
opacityblurwidthoffsetstroke параметрыПример комплексного стилизованного слоя:
{
id: 'water',
type: 'fill',
paint: {
'fill-color': '#a8dadc',
'fill-opacity': 0.7,
'fill-outline-color': '#457b9d'
}
}