Метод setStyle в библиотеке Mapbox GL JS используется
для полной замены текущего стиля карты на новый. Он работает на уровне
всего рендера и затрагивает все источники данных, слои, фильтры,
изображения и конфигурацию отображения. Это один из наиболее «тяжёлых»
методов API, поскольку инициирует пересборку визуального состояния
карты.
map.setStyle(style, options);
style Строка или объект, описывающий стиль карты:
options (необязательный параметр) Объект с настройками поведения при смене стиля.
Пример:
map.setStyle('mapbox://styles/mapbox/streets-v12');
При вызове setStyle происходит полная перезагрузка стиля
карты:
layers)sources)images)Важно учитывать, что сам объект map не уничтожается —
пересоздаётся только визуальная часть.
Процесс смены можно условно разделить на этапы:
При вызове setStyle карта помечается как находящаяся в
состоянии загрузки нового стиля.
map.setStyle(newStyle);
На этом этапе:
styledataУдаляются:
addLayeraddSource)addImage)Это означает, что любые динамически добавленные элементы исчезают.
Если передан URL:
map.setStyle('mapbox://styles/mapbox/light-v11');
Mapbox GL JS выполняет:
Если передан объект:
map.setStyle({
version: 8,
sources: {},
layers: []
});
Загрузка происходит синхронно без сетевого запроса.
После загрузки нового стиля:
sourcelayerПосле завершения загрузки вызываются события:
style.loadrenderidleКарта становится готовой к использованию.
После смены стиля все источники из предыдущего стиля исчезают.
Пример:
map.addSource('points', {
type: 'geojson',
data: 'data.geojson'
});
После вызова:
map.setStyle('mapbox://styles/mapbox/dark-v11');
источник points будет удалён.
Для сохранения источников необходимо повторно добавлять их после загрузки нового стиля:
map.on('style.load', () => {
map.addSource('points', {
type: 'geojson',
data: 'data.geojson'
});
});
Все добавленные слои также удаляются.
map.addLayer({
id: 'custom-layer',
type: 'circle',
source: 'points'
});
После смены стиля:
map.setStyle(newStyle);
слой custom-layer перестаёт существовать.
Обычно используется событие:
map.on('style.load', () => {
map.addLayer({
id: 'custom-layer',
type: 'circle',
source: 'points'
});
});
Срабатывает после полной загрузки нового стиля.
map.on('style.load', () => {
// стиль полностью загружен
});
Вызывается при частичной загрузке данных стиля.
Используется для отслеживания прогресса:
map.on('styledata', () => {
console.log('данные стиля обновляются');
});
Генерируется при обновлении источников и тайлов.
При вызове setStyle сбрасываются:
expressions)Однако сохраняются:
Mapbox GL JS позволяет передавать дополнительные параметры:
map.setStyle('mapbox://styles/mapbox/outdoors-v12', {
diff: false
});
diff: true/false
Определяет, будет ли применяться «дифференциальное» обновление стиля.
true — пытается сохранить существующие слои и
источники, если они совпадаютfalse — полная перезагрузка стиляmap.setStyle('mapbox://styles/mapbox/light-v11');
Используется при смене типа карты (например, с улиц на спутник).
map.setStyle('mapbox://styles/mapbox/streets-v12', {
diff: true
});
Позволяет сохранить часть состояния, если структура стиля совместима.
Все добавленные через API объекты удаляются.
Нельзя сразу обращаться к слоям после вызова:
map.setStyle(newStyle);
// ❌ слой ещё не существует
map.getLayer('roads');
Правильный подход:
map.once('style.load', () => {
map.getLayer('roads');
});
Каждый вызов:
Частые вызовы setStyle приводят к заметным лагам.
Часто требуется сохранять:
Типичный паттерн:
const state = {
filters: map.getFilter('my-layer'),
center: map.getCenter(),
zoom: map.getZoom()
};
map.setStyle(newStyle);
map.once('style.load', () => {
map.setFilter('my-layer', state.filters);
map.setCenter(state.center);
map.setZoom(state.zoom);
});
map.setStyle('mapbox://styles/mapbox/dark-v11');
map.once('style.load', () => {
map.addSource('cities', {
type: 'geojson',
data: '/cities.geojson'
});
map.addLayer({
id: 'cities-layer',
type: 'circle',
source: 'cities',
paint: {
'circle-radius': 6,
'circle-color': '#ff0000'
}
});
});
Mapbox GL JS активно использует кеш:
Однако setStyle очищает внутренний кеш состояния
рендера, сохраняя только сетевые кеши браузера.
Метод setStyle является точкой пересборки всей
графической сцены:
Фактически это аналог «перезапуска сцены» без пересоздания карты как объекта.
map.setStyle(style);
map.getLayer('layer'); // ошибка
map.setStyle(style);
// addSource не выполнен заново
setInterval(() => {
map.setStyle(nextStyle);
}, 1000);
Приводит к деградации производительности и утечкам памяти.
function changeStyle(style) {
map.setStyle(style);
map.once('style.load', initLayers);
}
function saveState(map) {
return {
center: map.getCenter(),
zoom: map.getZoom(),
bearing: map.getBearing(),
pitch: map.getPitch()
};
}
function restoreState(map, state) {
map.setCenter(state.center);
map.setZoom(state.zoom);
map.setBearing(state.bearing);
map.setPitch(state.pitch);
}