Связка Mapbox GL JS и Mapbox Studio строится вокруг единого формата описания карты — Style Specification (style JSON). Studio выступает средой визуального конструирования стиля, а GL JS — средой исполнения этого стиля в браузере.
Основной принцип взаимодействия:
Ключевой связующий элемент — Style URL.
После публикации стиля в Mapbox Studio он получает уникальный идентификатор вида:
mapbox://styles/{username}/{style_id}
Этот URL используется напрямую в GL JS:
import mapboxgl from "mapbox-gl";
mapboxgl.accessToken = "YOUR_MAPBOX_ACCESS_TOKEN";
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/username/style_id",
center: [37.6173, 55.7558],
zoom: 10
});
При инициализации происходит:
Стиль, созданный в Mapbox Studio, представляет собой JSON-документ со следующими ключевыми секциями:
sources — источники данных (vector, raster,
geojson)layers — визуальные слоиglyphs — шрифтыsprite — иконкиtransition — анимацииlight — освещение (для 3D)Пример фрагмента:
{
"version": 8,
"sources": {
"streets": {
"type": "vector",
"url": "mapbox://mapbox.mapbox-streets-v8"
}
},
"layers": [
{
"id": "road-primary",
"type": "line",
"source": "streets",
"source-layer": "road",
"paint": {
"line-color": "#ff0000",
"line-width": 2
}
}
]
}
GL JS интерпретирует эту структуру без необходимости ручного построения слоёв при загрузке.
После загрузки стиля через Mapbox GL JS возможна динамическая модификация карты без возврата в Studio.
map.on("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": "#1da1f2"
}
});
});
Studio определяет базовую структуру, GL JS расширяет её runtime-слоями.
Любой слой, созданный в Mapbox Studio, может быть изменён через API:
map.setPaintProperty("road-primary", "line-color", "#00ff00");
map.setLayoutProperty("road-primary", "visibility", "none");
Механизм:
idКаждая публикация стиля в Mapbox Studio создаёт новую версию. GL JS всегда загружает immutable snapshot стиля.
Преимущества:
Использование:
mapbox://styles/username/style_id
или с указанием версии:
mapbox://styles/username/style_id?fresh=true
GL JS позволяет менять стиль без пересоздания карты:
map.setStyle("mapbox://styles/username/dark-style");
Поведение:
style.load возможно повторное добавление
кастомных слоёвПосле setStyle пользовательские слои должны быть
восстановлены:
map.on("style.load", () => {
map.addSource("custom", {
type: "geojson",
data: "/data/custom.geojson"
});
map.addLayer({
id: "custom-layer",
type: "circle",
source: "custom"
});
});
Причина:
Mapbox использует токены доступа:
mapboxgl.accessToken = "pk.xxxxx";
Токен определяет доступ к:
В Mapbox Studio создаются tilesets, которые затем подключаются как источники:
{
"sources": {
"custom-tiles": {
"type": "vector",
"url": "mapbox://username.tileset_id"
}
}
}
В GL JS:
map.addSource("custom-tiles", {
type: "vector",
url: "mapbox://username.tileset_id"
});
Tilesets обеспечивают:
Стиль Studio включает ссылки:
"sprite": "mapbox://sprites/username/style_id",
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf"
GL JS загружает:
Это обеспечивает:
После загрузки стиля Studio возможно управление фильтрами:
map.setFilter("poi-labels", [
"all",
["==", "class", "restaurant"]
]);
Механизм:
Типовой сценарий:
Пример:
map.on("click", "poi-layer", (e) => {
const feature = e.features[0];
new mapboxgl.Popup()
.setLngLat(feature.geometry.coordinates)
.setHTML(feature.properties.name)
.addTo(map);
});
Studio отвечает за визуальную базу, GL JS — за поведение.
Mapbox GL JS позволяет управлять порядком слоёв, созданных в Studio:
map.moveLayer("water-layer", "road-primary");
или вставка:
map.addLayer(layer, "road-label");
Это важно при комбинировании:
Критический этап интеграции:
map.on("load", () => {
// стиль Studio полностью загружен
});
Дополнительно:
styledatasourcedatarenderЭти события позволяют синхронизировать внешние данные с визуализацией.
GL JS предоставляет перехват запросов:
const map = new mapboxgl.Map({
container: "map",
style: "mapbox://styles/username/style_id",
transformRequest: (url, resourceType) => {
if (resourceType === "Tile") {
return {
url,
headers: { Authorization: "Bearer TOKEN" }
};
}
}
});
Используется для:
Mapbox Studio:
Mapbox GL JS:
Mapbox: