Линейные слои (line) используются для отображения дорог,
маршрутов, границ, инженерных сетей, треков GPS и любых других объектов,
представленных в виде последовательности координат. Визуальное
оформление линий в Mapbox GL JS определяется набором параметров секции
paint, среди которых наиболее важными являются:
line-color — цвет линии;line-width — толщина линии;line-dasharray — шаблон штриховки.Эти свойства позволяют создавать как простые линии, так и сложные картографические стили, напоминающие профессиональные ГИС-системы.
Исходный слой обычно строится на основе GeoJSON с геометрией типа
LineString.
map.addSource('route', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'LineString',
coordinates: [
[37.6176, 55.7558],
[37.6500, 55.7700],
[37.7000, 55.7800]
]
}
}
});
map.addLayer({
id: 'route-line',
type: 'line',
source: 'route',
paint: {
'line-color': '#0066ff',
'line-width': 4
}
});
В данном примере создаётся синяя линия толщиной 4 пикселя.
Свойство line-color определяет основной цвет линии.
paint: {
'line-color': '#ff0000'
}
Результатом будет красная линия.
Mapbox GL JS поддерживает несколько способов задания цвета.
'line-color': '#00ff00'
'line-color': '#0f0'
'line-color': 'rgb(0, 255, 0)'
'line-color': 'rgba(0, 255, 0, 0.5)'
Последний параметр задаёт прозрачность.
'line-color': 'blue'
Хотя такой вариант поддерживается, в крупных проектах обычно используются HEX или RGBA для большей предсказуемости.
Цвет можно менять динамически.
map.setPaintProperty(
'route-line',
'line-color',
'#ff8800'
);
После выполнения линия немедленно перерисовывается.
Если в данных присутствует поле с цветом, можно использовать выражения.
GeoJSON:
{
type: 'Feature',
properties: {
color: '#ff0000'
},
geometry: {
type: 'LineString',
coordinates: [...]
}
}
Стиль:
paint: {
'line-color': ['get', 'color']
}
Каждый объект будет отображаться своим цветом.
Часто цвет зависит от характеристик объекта.
Например, от типа дороги:
paint: {
'line-color': [
'match',
['get', 'road_type'],
'highway', '#ff0000',
'primary', '#ffaa00',
'secondary', '#00aa00',
'#888888'
]
}
В результате разные дороги автоматически получают собственное оформление.
Для линий возможно создание плавного перехода цвета.
Источник:
map.addSource('route', {
type: 'geojson',
lineMetrics: true,
data: routeData
});
Стиль:
paint: {
'line-gradient': [
'interpolate',
['linear'],
['line-progress'],
0, '#0000ff',
0.5, '#00ff00',
1, '#ff0000'
]
}
Здесь цвет плавно меняется по всей длине линии.
Следует учитывать, что при использовании line-gradient
свойство line-color фактически заменяется градиентом.
Свойство line-width определяет толщину линии в
пикселях.
paint: {
'line-width': 2
}
Тонкая линия:
paint: {
'line-width': 1
}
Толстая линия:
paint: {
'line-width': 10
}
Разница между значениями выглядит примерно следующим образом:
| Значение | Результат |
|---|---|
| 1 | Очень тонкая линия |
| 2–4 | Стандартные маршруты |
| 5–8 | Акцентированные объекты |
| 10+ | Магистрали, выделенные маршруты |
map.setPaintProperty(
'route-line',
'line-width',
8
);
Толщина обновится без пересоздания слоя.
GeoJSON:
{
type: 'Feature',
properties: {
width: 6
},
geometry: {
type: 'LineString',
coordinates: [...]
}
}
Стиль:
paint: {
'line-width': ['get', 'width']
}
Каждый объект будет иметь собственную толщину.
Наиболее распространённый сценарий — увеличение толщины при приближении карты.
paint: {
'line-width': [
'interpolate',
['linear'],
['zoom'],
5, 1,
10, 3,
15, 8
]
}
Поведение:
| Масштаб | Толщина |
|---|---|
| 5 | 1 px |
| 10 | 3 px |
| 15 | 8 px |
Между указанными значениями выполняется плавная интерполяция.
Возможно учитывать одновременно уровень масштабирования и свойства объекта.
paint: {
'line-width': [
'*',
['get', 'importance'],
[
'interpolate',
['linear'],
['zoom'],
5, 1,
15, 5
]
]
}
Такой подход часто применяется при стилизации дорожных сетей.
Для создания контура используют несколько слоёв.
Нижний слой:
{
id: 'route-border',
type: 'line',
source: 'route',
paint: {
'line-color': '#000000',
'line-width': 8
}
}
Верхний слой:
{
id: 'route-main',
type: 'line',
source: 'route',
paint: {
'line-color': '#00aaff',
'line-width': 5
}
}
Получается эффект обводки, характерный для дорожных карт.
Свойство line-dasharray создаёт пунктирные линии.
Значение задаётся массивом чисел.
paint: {
'line-dasharray': [2, 2]
}
Первое число определяет длину штриха, второе — длину промежутка.
[2, 2]
означает:
██ ██ ██ ██
[4, 2]
означает:
████ ████ ████
[1, 3]
означает:
█ █ █ █
paint: {
'line-color': '#ff0000',
'line-width': 3,
'line-dasharray': [3, 3]
}
Такой стиль часто используется для отображения границ.
paint: {
'line-dasharray': [8, 2]
}
Получается линия с длинными сегментами и короткими промежутками.
paint: {
'line-dasharray': [2, 8]
}
Применяется для второстепенных объектов или служебных обозначений.
Массив может содержать несколько пар значений.
paint: {
'line-dasharray': [4, 2, 1, 2]
}
Шаблон:
████ █ ████ █
После завершения последовательность повторяется.
Тонкая пунктирная линия:
paint: {
'line-width': 1,
'line-dasharray': [2, 2]
}
Толстая пунктирная линия:
paint: {
'line-width': 8,
'line-dasharray': [2, 2]
}
При увеличении толщины визуальное восприятие штрихов существенно меняется.
paint: {
'line-color': '#333333',
'line-width': 2,
'line-dasharray': [3, 2]
}
paint: {
'line-color': '#008800',
'line-width': 4,
'line-dasharray': [1, 1]
}
paint: {
'line-color': '#ff8800',
'line-width': 5,
'line-dasharray': [5, 3]
}
paint: {
'line-color': '#0066cc',
'line-width': 3,
'line-dasharray': [2, 4]
}
Все три свойства обычно работают вместе.
Пример оформления маршрута:
map.addLayer({
id: 'hiking-route',
type: 'line',
source: 'route',
paint: {
'line-color': '#00aa55',
'line-width': 4,
'line-dasharray': [2, 2]
}
});
Результат:
map.addLayer({
id: 'adaptive-route',
type: 'line',
source: 'route',
paint: {
'line-color': '#0066ff',
'line-width': [
'interpolate',
['linear'],
['zoom'],
5, 1,
10, 3,
15, 7
],
'line-dasharray': [3, 2]
}
});
Линия становится толще по мере приближения карты, сохраняя пунктирный стиль.
Контур:
map.addLayer({
id: 'route-outline',
type: 'line',
source: 'route',
paint: {
'line-color': '#000000',
'line-width': 10
}
});
Основная линия:
map.addLayer({
id: 'route-main',
type: 'line',
source: 'route',
paint: {
'line-color': '#ffcc00',
'line-width': 6,
'line-dasharray': [4, 2]
}
});
Такой приём обеспечивает высокую читаемость маршрута на любом фоне карты.
Использование выражений (expressions)
предпочтительнее создания большого количества отдельных слоёв. Один слой
с условной стилизацией обычно работает быстрее десятков однотипных
слоёв.
Масштабозависимая толщина (line-width)
считается стандартной практикой для большинства картографических
проектов, поскольку обеспечивает одинаковое визуальное восприятие
объектов на разных уровнях приближения.
Пунктирные линии (line-dasharray)
требуют дополнительных вычислений при рендеринге. Для большого
количества объектов желательно использовать умеренно сложные шаблоны
штриховки.
Цветовые схемы (line-color)
рекомендуется подбирать с учётом контраста относительно базовой карты,
чтобы маршруты и линейные объекты оставались хорошо различимыми при
любом масштабе.
Комбинация нескольких линейных слоёв позволяет создавать профессиональные картографические эффекты: обводку дорог, подсветку маршрутов, выделение активных объектов и визуальное разделение разных категорий линий без изменения исходных данных.