Стили в Mapbox GL JS представляют собой декларативное описание визуального представления карты, основанное на спецификации Mapbox Style Specification. Стиль определяет не только внешний вид слоёв, но и источники данных, правила их отображения, типографику, цвета, фильтрацию, поведение при масштабировании и реакцию на свойства данных.
Основой кастомизации выступает JSON-структура стиля, где ключевыми сущностями являются источники данных (sources) и слои (layers). Источники предоставляют географическую информацию, а слои интерпретируют её визуально через набор параметров.
Стиль включает несколько фундаментальных блоков:
Источники данных задаются как именованные сущности:
"sources": {
"cities": {
"type": "geojson",
"data": "cities.geojson"
}
}
Слои связываются с источниками через поле source и
определяют тип визуализации:
Кастомизация начинается с изменения свойств слоя. Каждый слой содержит два основных блока:
Пример изменения цвета полигона:
{
"id": "land",
"type": "fill",
"source": "countries",
"paint": {
"fill-color": "#2ecc71",
"fill-opacity": 0.8
}
}
Свойства paint поддерживают динамическое изменение при
изменении масштаба, данных или условий.
Ключевым механизмом кастомизации выступают выражения (expressions). Они позволяют вычислять значения свойств на основе данных, масштаба и условий.
Основные типы выражений:
Пример цветовой интерполяции по зуму:
"fill-color": [
"interpolate",
["linear"],
["zoom"],
5, "#fee8c8",
10, "#fdbb84",
15, "#e34a33"
]
Такой подход позволяет плавно изменять визуализацию при масштабировании карты.
Data-driven styling позволяет изменять внешний вид объектов в зависимости от их атрибутов.
Пример:
"circle-radius": [
"interpolate",
["linear"],
["get", "population"],
1000, 2,
1000000, 10
]
Здесь радиус точек зависит от значения поля
population.
Также используется конструкция match:
"fill-color": [
"match",
["get", "type"],
"park", "#2ecc71",
"water", "#3498db",
"#cccccc"
]
Порядок слоёв определяет визуальную иерархию. Слои рисуются в порядке
их расположения в массиве layers.
Манипуляции с порядком выполняются через API:
addLayer — добавление слояremoveLayer — удалениеmoveLayer — изменение позицииmap.addLayer({
id: "roads",
type: "line",
source: "streets",
paint: {
"line-color": "#333",
"line-width": 2
}
});
Смена всего стиля осуществляется методом setStyle,
который загружает новый JSON-стиль:
map.setStyle("mapbox://styles/mapbox/dark-v11");
После смены стиля все кастомные слои, добавленные вручную, требуют повторного добавления, поскольку стиль перезагружается полностью.
Создание тематических карт базируется на модификации базовых параметров:
Светлая и тёмная темы реализуются через переключение набора значений
paint:
"background-color": "#111111"
или
"background-color": "#ffffff"
Текстовые слои используют symbol тип и зависят от
glyphs. Шрифты задаются через шаблоны:
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
Кастомизация текста включает:
text-size)text-font)text-color)text-halo-color)Пример:
"text-field": ["get", "name"],
"text-size": 14,
"text-color": "#222"
Иконки управляются через sprite-атлас, представляющий собой единый набор изображений.
"sprite": "mapbox://sprites/mapbox/streets-v11"
Кастомизация включает:
icon-sizeПереходы между значениями свойств задаются через
transition:
"transition": {
"duration": 300,
"delay": 0
}
Это позволяет сглаживать изменения цвета, прозрачности и других визуальных параметров.
Фильтры определяют, какие объекты отображаются в слое:
"filter": ["==", ["get", "type"], "road"]
Поддерживаются логические операции:
==!=><inallanyZoom-based styling позволяет менять визуализацию в зависимости от уровня приближения карты:
"line-width": [
"interpolate",
["linear"],
["zoom"],
10, 1,
18, 5
]
Это критично для картографической читаемости, когда плотность объектов изменяется при зуме.
Тип слоя fill-extrusion используется для создания
объёмных объектов:
"fill-extrusion-height": ["get", "height"],
"fill-extrusion-color": "#aaa"
Такой подход применяется для визуализации зданий и рельефа.
Производительность стиля зависит от:
Оптимизация достигается через агрегацию слоёв, упрощение выражений и использование векторных тайлов вместо GeoJSON при больших объёмах данных.
Помимо стандартных источников поддерживаются динамические обновления:
map.getSource("points").setData(newGeoJson);
Это позволяет изменять визуализацию без перезагрузки стиля.
В экосистеме Mapbox стили часто создаются в визуальном редакторе Mapbox Studio. Там формируются базовые шаблоны, которые затем модифицируются через API.
Редактор позволяет управлять:
Сложные стили формируются как комбинация независимых визуальных слоёв. Каждый слой отвечает за отдельный аспект карты: фон, вода, дороги, здания, подписи.
Такой подход обеспечивает модульность и управляемость визуальной системы, где каждый элемент можно переопределять независимо от остальных.