Mapbox GL JS строится вокруг императивной модели управления картой,
где ключевой объект Map выступает центральной точкой
взаимодействия. Вокруг него концентрируются все операции: создание
источников данных, управление слоями, подписка на события и модификация
состояния рендера. При этом API сохраняет чёткое разделение между
конфигурацией стиля и динамическими изменениями во время исполнения.
Одним из ключевых отличий API является переход от статичной конфигурации к реактивному управлению картой. В ранних версиях многие параметры задавались единожды при инициализации, тогда как современный API позволяет изменять практически все аспекты карты в рантайме без пересоздания экземпляра.
Объект карты создаётся через конструктор Map, который
принимает объект конфигурации. В API различаются подходы к обработке
жизненного цикла:
load как точка готовности для работы со
слоямиИзменение архитектуры жизненного цикла проявляется в том, что доступ к слоям и источникам возможен только после завершения загрузки стиля. Это влияет на структуру кода: логика работы с картой выносится в обработчики событий, а не выполняется последовательно после создания объекта.
API стилей представляет собой декларативную модель, основанную на спецификации Style Specification. Стиль — это JSON-структура, описывающая:
Различие API заключается в том, что стиль можно:
setStyleaddLayer,
removeLayer, setPaintProperty,
setLayoutPropertyПереход между стилями не является мгновенной операцией с точки зрения внутреннего рендера: происходит пересборка графа слоёв и переинициализация WebGL контекста.
Источники данных в API разделены по типам:
geojsonvectorrasterimagevideoraster-demРазличие API проявляется в способе обновления источников. Для GeoJSON
используется метод setData, который позволяет обновлять
данные без пересоздания источника. Векторные и растровые источники,
напротив, зависят от тайловой структуры и обновляются через изменение
URL-шаблонов или параметров.
Существенным отличием является наличие строгой связи между источником и слоями: слой не может существовать без привязанного source, что фиксируется на уровне API и проверяется во время выполнения.
Слой в API представляет собой отдельную единицу визуализации, описывающую:
Различие API проявляется в строгой типизации свойств слоёв. Каждый тип слоя поддерживает ограниченный набор параметров, что снижает гибкость, но повышает предсказуемость рендера.
Изменение свойств слоя происходит через отдельные методы:
setPaintPropertysetLayoutPropertyЭто исключает необходимость полной пересборки слоя при небольших изменениях визуального представления.
API событий построено на подписочной модели. Объект карты поддерживает события:
load, idle)click, mousemove,
drag)render, resize)Различие заключается в том, что события привязаны не только к DOM, но и к WebGL-сцене. Например, координаты клика вычисляются относительно географической проекции, а не пиксельной сетки.
Дополнительно присутствует слой абстракции hit-testing, который
позволяет определять попадание курсора в географические объекты через
методы queryRenderedFeatures и
querySourceFeatures.
API использует Web Mercator как базовую проекцию. Это накладывает ограничения на геометрические вычисления и влияет на работу с расстояниями и площадями.
Различие API заключается в том, что географические координаты
(lng, lat) используются как основная единица,
тогда как экранные координаты (x, y) являются
производными и вычисляются через матрицы трансформации.
При этом доступны методы:
project — перевод координат в экранныеunproject — обратное преобразованиеЭти методы являются ключевыми для построения пользовательских интерактивных слоёв поверх карты.
Рендеринг в Mapbox GL JS осуществляется через WebGL, что радикально отличает API от Canvas- или DOM-ориентированных библиотек.
Основные отличия API рендера:
API не предоставляет прямого доступа к WebGL-контексту, но допускает
расширение через пользовательские слои
(CustomLayerInterface), где разработчик управляет жизненным
циклом WebGL объектов.
Состояние карты включает:
API различает мгновенные и анимированные изменения. Например, методы
setCenter и setZoom изменяют состояние без
анимации, тогда как flyTo и easeTo используют
интерполяцию.
Различие API заключается в том, что все трансформации описываются как непрерывные функции, а не дискретные шаги, что позволяет синхронизировать визуальные переходы с рендером.
API предоставляет несколько уровней расширения:
IControl)CustomLayerInterface)Mapbox строит архитектуру API таким образом, чтобы ядро оставалось минимальным, а расширения подключались поверх него без модификации внутреннего рендера.
Различие API в этом контексте проявляется в строгом контракте между ядром и расширениями: любые пользовательские компоненты должны соответствовать жизненному циклу карты и не нарушать WebGL pipeline.
API включает механизмы автоматического управления памятью:
Различие API заключается в том, что разработчик не управляет памятью
напрямую, но может влиять на производительность через параметры
источников и слоёв, такие как maxzoom,
minzoom, tileSize, buffer.
Доступ к API требует использования access token, который передаётся при инициализации карты. Это фундаментальное отличие от открытых библиотек рендеринга карт.
Модель безопасности включает:
Это влияет на архитектуру приложения: доступ к данным маршрутизируется через инфраструктуру провайдера, а не загружается напрямую без авторизации.