Система стилей в Mapbox GL JS построена вокруг декларативного JSON-описания визуализации карты. Стиль определяет, какие данные отображаются, как они интерпретируются и каким образом визуализируются на WebGL-контексте. Вся модель рендеринга отделена от логики приложения и опирается на спецификацию Mapbox Style Specification, что позволяет динамически изменять внешний вид карты без пересоздания слоя отображения.
Основой выступает объект style, который агрегирует источники данных (sources), слои (layers), ресурсы шрифтов (glyphs), спрайты (sprites) и параметры световой модели (light). Такая структура обеспечивает независимость геометрии данных от их визуального представления.
Style в Mapbox GL JS представляет собой JSON-документ с фиксированной схемой:
version — версия спецификации стилейsources — набор источников данных (vector, raster,
geojson, image)layers — визуальные слои, определяющие отрисовкуglyphs — шаблон URL для загрузки шрифтовsprite — набор иконок и изображенийtransition — глобальные параметры анимации
измененийlight — модель освещения для 3D-слоевКаждый слой в layers связан с конкретным источником
данных через поле source. Это обеспечивает строгую
декомпозицию данных и визуализации.
Sources являются фундаментом стилевой системы. Они определяют способ получения географических данных:
Каждый source описывается объектом с параметрами:
typeurl или tilestileSizeminzoom / maxzoomVector sources являются наиболее производительными, так как позволяют выполнять стилизацию на уровне геометрии и атрибутов.
Layers представляют собой упорядоченный стек визуализации. Порядок в
массиве layers определяет z-index отрисовки.
Основные типы слоёв:
Каждый слой содержит ключевые поля:
id — уникальный идентификаторtype — тип слояsource / source-layerpaint — визуальные свойстваlayout — поведение и размещениеСистема свойств слоя делится на два уровня:
layout properties определяют поведение:
visibility)symbol-placement)paint properties отвечают за внешний вид:
fill-color, line-color)opacity)blur)line-width)Разделение позволяет оптимизировать рендеринг: layout пересчитывается реже, paint может обновляться плавно в реальном времени.
Одной из ключевых возможностей является data-driven styling — привязка визуальных параметров к атрибутам данных.
Используются выражения (expressions):
interpolate)case, match)+, *, get)Пример концепции:
populationТакая модель заменяет классическую императивную логику стилизации декларативными правилами внутри JSON.
Expressions формируют мини-язык внутри стиля. Они выполняются в рантайме и позволяют:
get)zoom)Типичные выражения:
interpolate(linear, zoom, ...)step(get("value"), ...)match(get("type"), ...)Выражения компилируются в оптимизированные структуры, что позволяет выполнять их на GPU-ориентированном pipeline.
Mapbox GL JS предоставляет runtime API для управления стилями:
setStyle(style) — полная замена стиляgetStyle() — получение текущего состоянияaddLayer(layer, beforeId?) — добавление слояremoveLayer(id) — удаление слояsetLayoutProperty(layer, name, value) — изменение
layoutsetPaintProperty(layer, name, value) — изменение
визуальных параметровsetFilter(layer, filter) — фильтрация данныхИзменения применяются инкрементально, что позволяет избегать полного пересоздания WebGL контекста.
Внутренний механизм style diffing сравнивает старую и новую версии стиля. Обновляются только изменённые узлы:
Это снижает стоимость обновления карты при динамических интерфейсах, где стиль меняется часто.
Sprite представляет собой атлас изображений для иконок. Он загружается в двух форматах:
Glyphs — шрифтовые тайлы для рендеринга текста. Они подгружаются по URL-шаблону:
Глобальный объект transition задаёт параметры
интерполяции:
Каждое paint-свойство может быть интерполируемым, что обеспечивает плавные переходы при изменении стилей.
Слои поддерживают фильтрацию через filter, основанную на
выражениях:
Фильтры выполняются до рендеринга, уменьшая нагрузку на GPU.
Связь layers и sources реализуется через:
source — идентификатор источникаsource-layer — слой внутри vector tilesVector tiles могут содержать множество тематических слоёв (дороги, здания, вода), что позволяет переиспользовать один источник для разных визуализаций.
Style specification имеет версионную модель:
Система стилей тесно связана с платформой Mapbox, предоставляющей:
Runtime API позволяет строить интерактивные сценарии:
Изменения применяются без перезагрузки карты, что обеспечивает непрерывный пользовательский опыт.
Стилевая система напрямую транслируется в WebGL инструкции:
Такой подход обеспечивает масштабирование до миллионов объектов на карте без деградации интерактивности.