Визуальное представление карты в Mapbox GL JS определяется стилем (style). Стиль — это JSON-спецификация, описывающая внешний вид всех слоёв, источников данных, шрифтов, цветов, прозрачности, а также правил отрисовки геометрии.
Стиль отделяет данные от их визуализации: источники могут оставаться неизменными, тогда как визуальная оболочка полностью переопределяется без модификации данных.
Ключевые элементы стиля:
Стиль представляет собой JSON-объект с фиксированной структурой:
{
"version": 8,
"name": "Custom Style",
"sources": {},
"layers": [],
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
"sprite": "mapbox://sprites/mapbox/streets-v11",
"transition": {
"duration": 300,
"delay": 0
}
}
Фиксированное значение 8 — текущая версия спецификации
стилей.
Описание источников данных:
"sources": {
"cities": {
"type": "vector",
"url": "mapbox://examples.8fgz4egr"
}
}
Типы источников:
Массив слоёв определяет порядок отрисовки. Каждый слой описывает:
Стандартные стили предоставляют готовые визуальные шаблоны:
Каждый стиль представляет собой полноценный JSON-документ, который можно модифицировать или использовать как основу.
Стиль задаётся при инициализации карты:
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
});
Также допускается использование локального JSON:
const map = new mapboxgl.Map({
container: "map",
style: {
version: 8,
sources: {},
layers: []
}
});
Стиль можно менять во время работы карты:
map.setStyle("mapbox://styles/mapbox/dark-v11");
После смены стиля:
style.load повторно срабатываютДля восстановления кастомных слоёв используется обработчик:
map.on("style.load", () => {
map.addSource("points", {
type: "geojson",
data: pointsData
});
map.addLayer({
id: "points-layer",
type: "circle",
source: "points",
paint: {
"circle-radius": 6,
"circle-color": "#ff0000"
}
});
});
Слой (layer) определяет, как отображаются данные из источника.
Основные типы слоёв:
map.addLayer({
id: "route",
type: "line",
source: "route-source",
layout: {
"line-join": "round",
"line-cap": "round"
},
paint: {
"line-color": "#3b9ddd",
"line-width": 4
}
});
Источник определяет, откуда поступают географические данные.
map.addSource("points", {
type: "geojson",
data: {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {
type: "Point",
coordinates: [37.6173, 55.7558]
}
}
]
}
});
map.addSource("buildings", {
type: "vector",
url: "mapbox://mapbox.3d-buildings"
});
Mapbox GL JS поддерживает expression-систему для динамической стилизации.
"circle-color": [
"interpolate",
["linear"],
["get", "population"],
0, "#2DC4B2",
1000, "#3BB3C3",
5000, "#669EC4",
10000, "#8B88B6"
]
"circle-radius": [
"case",
["boolean", ["get", "selected"], false],
10,
5
]
Стиль может быть полностью определён вручную.
Минимальный пример:
const customStyle = {
version: 8,
sources: {
osm: {
type: "raster",
tiles: [
"https://tile.openstreetmap.org/{z}/{x}/{y}.png"
],
tileSize: 256
}
},
layers: [
{
id: "osm-layer",
type: "raster",
source: "osm"
}
]
};
Стиль часто используется для реализации светлой и тёмной темы.
const light = "mapbox://styles/mapbox/light-v11";
const dark = "mapbox://styles/mapbox/dark-v11";
function toggleTheme(isDark) {
map.setStyle(isDark ? dark : light);
}
После смены стиля необходимо повторно добавлять пользовательские слои.
Порядок слоёв критически важен. Новый слой добавляется поверх существующих.
map.addLayer({
id: "labels",
type: "symbol",
source: "points",
layout: {
"text-field": ["get", "name"],
"text-size": 12
}
}, "waterway-label");
Здесь "waterway-label" задаёт слой, перед которым будет
вставлен новый.
Стили могут изменяться в зависимости от масштаба:
"line-width": [
"interpolate",
["linear"],
["zoom"],
5, 1,
10, 2,
15, 4
]
Это позволяет адаптировать визуализацию под уровень детализации.
Поддержка экструзии зданий:
map.addLayer({
id: "buildings-3d",
type: "fill-extrusion",
source: "composite",
"source-layer": "building",
paint: {
"fill-extrusion-height": ["get", "height"],
"fill-extrusion-color": "#aaa",
"fill-extrusion-opacity": 0.8
}
});
Sprite содержит иконки для symbol-слоёв:
"sprite": "mapbox://sprites/mapbox/streets-v11"
Glyphs определяют шрифты:
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
Без них текстовые подписи и иконки не отображаются.
Сложность стиля напрямую влияет на производительность:
Оптимизация включает:
В крупных приложениях стили разделяются:
Такой подход позволяет переиспользовать базовую карту без дублирования логики визуализации.