В основе визуализации карт в Mapbox GL JS лежит концепция стилей, определяющих внешний вид карты: цвета, слои, шрифты, иконки, прозрачность и поведение данных при масштабировании. Эти стили создаются и редактируются в Mapbox Studio и затем используются в клиентских приложениях через Mapbox GL JS.
Стиль в Mapbox представляет собой JSON-документ, описывающий:
Mapbox Studio выступает как визуальный редактор, а Mapbox GL JS — как движок рендеринга этих стилей в браузере.
Стиль Mapbox GL JS базируется на спецификации Style Specification. Основные компоненты:
sources Определяют источники геоданных:
{
"type": "vector",
"url": "mapbox://mapbox.mapbox-streets-v8"
}
Поддерживаемые типы:
layers Каждый слой описывает способ отображения данных:
{
"id": "water",
"type": "fill",
"source": "mapbox-streets",
"source-layer": "water",
"paint": {
"fill-color": "#2c7fb8"
}
}
Тип слоя определяет рендеринг:
Подключение стиля осуществляется через параметр style
при инициализации карты:
import mapboxgl from "mapbox-gl";
mapboxgl.accessToken = "YOUR_TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/mapbox/streets-v12",
center: [37.6173, 55.7558],
zoom: 10
});
Значение style может быть:
Mapbox предоставляет набор готовых стилей, созданных в Mapbox Studio:
Эти стили можно использовать как есть или клонировать в Mapbox Studio для кастомизации.
Mapbox Studio позволяет модифицировать визуальные параметры без ручного редактирования JSON.
Основные возможности:
Каждое изменение в интерфейсе Studio отражается в JSON-стиле, который затем используется Mapbox GL JS.
Стиль можно менять во время работы карты:
map.setStyle("mapbox://styles/mapbox/dark-v11");
После смены стиля требуется учитывать:
Для сохранения состояния используют событие
style.load:
map.on("style.load", () => {
map.addSource("points", {
type: "geojson",
data: "/data/points.geojson"
});
map.addLayer({
id: "points-layer",
type: "circle",
source: "points",
paint: {
"circle-radius": 6,
"circle-color": "#ff0000"
}
});
});
Даже если стиль создан в Mapbox Studio, его можно модифицировать программно.
Изменение цвета слоя:
map.setPaintProperty("water", "fill-color", "#1e90ff");
Изменение прозрачности:
map.setPaintProperty("water", "fill-opacity", 0.5);
Изменение текста:
map.setLayoutProperty("place-label", "text-field", ["get", "name_en"]);
Кастомный стиль создаётся в Mapbox Studio и экспортируется как URL:
mapbox://styles/username/styleid
В Mapbox GL JS он используется так же, как стандартный стиль:
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/username/ckexample123456"
});
Особенности кастомных стилей:
Порядок слоёв в JSON определяет визуальную иерархию:
Mapbox GL JS рендерит слои строго сверху вниз по порядку массива
layers.
Изменение порядка влияет на читаемость карты и приоритет отображения объектов.
Слои могут содержать фильтры:
"filter": ["==", "class", "park"]
Возможные операторы:
==, !=>, <, >=,
<=inall, any, noneФильтры позволяют разделять данные внутри одного источника без дублирования слоёв.
Mapbox Studio стили поддерживают интерполяцию значений:
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
5, 2,
10, 6,
15, 12
]
Это позволяет изменять визуализацию в зависимости от zoom-уровня:
Expressions позволяют строить динамическую логику:
"fill-color": [
"match",
["get", "type"],
"park", "#00ff00",
"water", "#0000ff",
"#cccccc"
]
Основные категории выражений:
Mapbox GL JS позволяет добавлять собственные источники поверх Studio стиля:
map.addSource("custom-data", {
type: "geojson",
data: "/data/custom.geojson"
});
map.addLayer({
id: "custom-layer",
type: "circle",
source: "custom-data",
paint: {
"circle-color": "#ff6600"
}
});
Такие слои могут:
Каждый стиль в Mapbox Studio имеет версию. При обновлении:
Это обеспечивает стабильность картографических приложений в продакшене.
Эффективность рендеринга зависит от структуры стиля:
Избыточная сложность стиля напрямую влияет на производительность WebGL-рендерера Mapbox GL JS.