В Mapbox GL JS визуальное оформление карты разделено на два крупных блока настроек:
Paint-свойства применяются внутри объекта paint при
описании слоя.
Пример:
map.addLayer({
id: 'water-layer',
type: 'fill',
source: 'water',
paint: {
'fill-color': '#4A90E2',
'fill-opacity': 0.7
}
});
В данном случае:
fill-color задаёт цвет полигона;fill-opacity определяет уровень прозрачности.Каждый тип слоя поддерживает собственный набор paint-свойств.
Слой Mapbox GL JS состоит из нескольких секций.
{
id: 'roads',
type: 'line',
source: 'roads-source',
layout: {
...
},
paint: {
...
}
}
Блок paint может содержать десятки различных параметров
в зависимости от типа слоя.
Например:
paint: {
'line-color': '#ff0000',
'line-width': 4,
'line-opacity': 0.8
}
Разные типы слоёв имеют различные наборы свойств.
| Тип слоя | Основные paint-свойства |
|---|---|
| fill | fill-color, fill-opacity |
| line | line-color, line-width |
| circle | circle-radius, circle-color |
| symbol | text-color, icon-opacity |
| fill-extrusion | fill-extrusion-height |
| raster | raster-opacity |
| hillshade | hillshade-shadow-color |
| background | background-color |
Каждая категория рассматривается отдельно.
Fill-слои используются для отображения полигонов.
Пример:
{
id: 'parks',
type: 'fill',
source: 'parks'
}
Определяет цвет заливки полигона.
paint: {
'fill-color': '#00AA55'
}
Можно использовать любые CSS-цвета:
'fill-color': 'red'
'fill-color': 'rgb(0,255,0)'
'fill-color': 'rgba(0,255,0,0.5)'
Управляет прозрачностью.
Диапазон:
0 — полностью прозрачный
1 — полностью непрозрачный
Пример:
paint: {
'fill-opacity': 0.4
}
Задаёт цвет контура полигона.
paint: {
'fill-color': '#55AAFF',
'fill-outline-color': '#000000'
}
Результат:
Позволяет использовать изображение вместо однотонной заливки.
Сначала изображение добавляется в стиль:
map.loadImage('pattern.png', (error, image) => {
map.addImage('pattern', image);
});
После этого:
paint: {
'fill-pattern': 'pattern'
}
Управляет сглаживанием границ.
paint: {
'fill-antialias': true
}
По умолчанию обычно включено.
Line-слои используются для дорог, рек, маршрутов и границ.
{
id: 'roads',
type: 'line'
}
Определяет цвет линии.
paint: {
'line-color': '#FF5500'
}
Задаёт толщину линии в пикселях.
paint: {
'line-width': 6
}
Прозрачность линии.
paint: {
'line-opacity': 0.5
}
Добавляет размытие.
paint: {
'line-blur': 2
}
Чем больше значение, тем мягче выглядит линия.
Создаёт внутренний зазор.
paint: {
'line-width': 8,
'line-gap-width': 4
}
Часто применяется для отображения дорог.
Смещение линии относительно исходной геометрии.
paint: {
'line-offset': 3
}
Полезно при рисовании параллельных маршрутов.
Создаёт пунктирную линию.
paint: {
'line-dasharray': [2, 2]
}
Пример:
paint: {
'line-color': '#000',
'line-width': 2,
'line-dasharray': [4, 2]
}
Позволяет создавать градиенты вдоль линии.
Пример:
paint: {
'line-gradient': [
'interpolate',
['linear'],
['line-progress'],
0, 'blue',
1, 'red'
]
}
Результат:
Circle-слои используются для отображения точек.
{
id: 'cities',
type: 'circle'
}
Радиус круга.
paint: {
'circle-radius': 10
}
Цвет маркера.
paint: {
'circle-color': '#FF0000'
}
Прозрачность.
paint: {
'circle-opacity': 0.7
}
Цвет обводки.
paint: {
'circle-stroke-color': '#FFFFFF'
}
Толщина границы.
paint: {
'circle-stroke-width': 3
}
Прозрачность контура.
paint: {
'circle-stroke-opacity': 0.8
}
Размытие круга.
paint: {
'circle-blur': 1
}
Часто применяется для визуализации плотности объектов.
Symbol-слои отображают иконки и текст.
{
id: 'labels',
type: 'symbol'
}
Цвет текста.
paint: {
'text-color': '#222222'
}
Прозрачность подписи.
paint: {
'text-opacity': 0.8
}
Цвет ореола вокруг текста.
paint: {
'text-halo-color': '#FFFFFF'
}
Толщина ореола.
paint: {
'text-halo-width': 2
}
Очень полезно для улучшения читаемости подписей.
Размытие ореола.
paint: {
'text-halo-blur': 1
}
Прозрачность иконки.
paint: {
'icon-opacity': 0.5
}
Изменяет цвет SDF-иконок.
paint: {
'icon-color': '#00AAFF'
}
Работает только для Signed Distance Field иконок.
Цвет ореола вокруг иконки.
paint: {
'icon-halo-color': '#FFFFFF'
}
Ширина ореола.
paint: {
'icon-halo-width': 2
}
Используются для создания трёхмерных зданий.
{
id: 'buildings',
type: 'fill-extrusion'
}
Цвет здания.
paint: {
'fill-extrusion-color': '#AAAAAA'
}
Высота объекта.
paint: {
'fill-extrusion-height': 100
}
Высота основания.
paint: {
'fill-extrusion-base': 10
}
Прозрачность.
paint: {
'fill-extrusion-opacity': 0.9
}
После создания слоя свойства можно изменять программно.
Для этого используется метод:
map.setPaintProperty()
Синтаксис:
map.setPaintProperty(
layerId,
propertyName,
value
);
Пример:
map.setPaintProperty(
'roads',
'line-color',
'#ff0000'
);
map.setPaintProperty(
'parks',
'fill-opacity',
0.3
);
map.setPaintProperty(
'roads',
'line-width',
8
);
Для чтения используется:
map.getPaintProperty()
Пример:
const width = map.getPaintProperty(
'roads',
'line-width'
);
Одно из важнейших преимуществ Paint Properties — возможность стилизовать объекты на основе данных.
Предположим, имеется поле:
population
в GeoJSON:
{
"population": 1500000
}
Размер маркера может зависеть от населения.
paint: {
'circle-radius': [
'interpolate',
['linear'],
['get', 'population'],
100000, 4,
1000000, 12,
5000000, 25
]
}
Чем больше население, тем больше круг.
Практически любое paint-свойство поддерживает выражения.
Пример цветовой шкалы:
paint: {
'circle-color': [
'match',
['get', 'status'],
'active', '#00ff00',
'inactive', '#ff0000',
'#999999'
]
}
Если:
status = active
объект станет зелёным.
Paint-свойства могут изменяться в зависимости от масштаба карты.
Пример:
paint: {
'line-width': [
'interpolate',
['linear'],
['zoom'],
5, 1,
10, 4,
15, 10
]
}
При увеличении масштаба линии становятся толще.
Mapbox GL JS умеет плавно анимировать изменение paint-свойств.
Для этого используются свойства вида:
*-transition
Пример:
paint: {
'fill-color': '#00AAFF',
'fill-color-transition': {
duration: 1000,
delay: 0
}
}
Параметры:
| Свойство | Описание |
|---|---|
| duration | продолжительность анимации |
| delay | задержка перед запуском |
map.setPaintProperty(
'water',
'fill-color',
'#FF0000'
);
Если задан переход, цвет будет изменяться плавно.
Наиболее дешёвыми по производительности обычно являются:
Более затратными считаются:
Для крупных карт рекомендуется:
map.addLayer({
id: 'cities',
type: 'circle',
source: 'cities',
paint: {
'circle-radius': [
'interpolate',
['linear'],
['get', 'population'],
100000, 5,
5000000, 25
],
'circle-color': [
'interpolate',
['linear'],
['get', 'population'],
100000, '#A5D6A7',
1000000, '#42A5F5',
5000000, '#E53935'
],
'circle-stroke-color': '#FFFFFF',
'circle-stroke-width': 2,
'circle-opacity': 0.8
}
});
В результате:
Такой подход демонстрирует основную идею Paint Properties: отделение визуального представления объектов от их геометрии и данных, что позволяет строить сложные, масштабируемые и динамически изменяемые стили карт непосредственно средствами Mapbox GL JS.