В основе всех вычислений в Mapbox GL JS лежит переход между географическими координатами и экранной системой координат. Исходные данные представлены в виде пары значений долгота/широта (longitude/latitude), однако рендеринг выполняется в пикселях.
Ключевой объект, управляющий преобразованиями, — внутренний трансформ карты. Он поддерживает переход между системами координат:
Основные методы:
map.project([lng, lat]) // -> { x, y }
map.unproject({ x, y }) // -> [lng, lat]
Эти операции основаны на математическом преобразовании сферы в плоскость через проекцию Меркатора.
Mapbox GL JS использует Web Mercator (EPSG:3857). Перевод широты выполняется через логарифмическую функцию:
[ y = (( + ))]
где:
Долгота преобразуется линейно:
[ x = ]
где:
После нормализации результат масштабируется под размер тайлового мира.
Особенность проекции — искажение площадей при удалении от экватора, что напрямую влияет на визуальную интерпретацию данных.
Внутренняя система Mapbox GL JS использует world coordinates, где весь мир представлен квадратом 0–1 на нулевом зуме.
Масштабирование задаётся экспоненциально:
[ scale = 2^{zoom}]
Переход к пиксельным координатам:
[ pixel = worldCoordinate tileSize ^{zoom}]
где:
Таким образом, каждое увеличение зума удваивает количество деталей по каждой оси.
Зум в Mapbox GL JS не является линейной величиной. Он описывает степень увеличения карты:
Обобщённая зависимость:
[ N = 2^{zoom}]
где ( N ) — количество тайлов по одной оси.
Это влияет на:
Mapbox GL JS использует матричные преобразования для управления камерой. Любая точка проходит через цепочку трансформаций:
Векторная форма:
[ P’ = M_{projection} M_{scale} M_{rotation} P]
Где матрица вращения по оси Z:
[ R_z() = ]
Поворот карты (bearing) — это вращение вокруг вертикальной оси, а наклон (pitch) добавляет перспективное искажение, влияющее на перспективное деление координат.
Стили в Mapbox GL JS поддерживают expression syntax, представляющий собой функциональный стек операций.
Основные математические операторы:
['+', a, b] — сложение['-', a, b] — вычитание['*', a, b] — умножение['/', a, b] — деление['^', a, b] — степень['%', a, b] — остатокПример вычисления:
[
'*',
['zoom'],
10
]
Значение зависит от уровня масштабирования карты.
Одним из ключевых математических механизмов является интерполяция.
Линейная интерполяция:
[ f(t) = a + (b - a) t]
В Mapbox GL JS:
[
'interpolate',
['linear'],
['zoom'],
5, 2,
10, 20
]
Это означает плавное изменение значения от 2 до 20 при изменении зума от 5 до 10.
Также используется экспоненциальная интерполяция:
[ f(t) = a (b/a)^t]
Применяется для нелинейного масштабирования визуальных параметров.
Mapbox expressions позволяют строить условные зависимости:
[
'case',
['>', ['zoom'], 10],
5,
2
]
Это фактически дискретная функция:
[ f(z) = ]
Такие конструкции часто используются для адаптации визуализации под масштаб.
Для вычисления расстояний между координатами применяется формула гаверсинусов:
[ d = 2R ()]
где:
В контексте Mapbox GL JS такие вычисления часто выполняются через внешние библиотеки, но используются в логике кластеризации, фильтрации и анализа данных.
Цвета в Mapbox GL JS интерпретируются как числовые вектора:
[ RGBA = (r, g, b, a)]
В выражениях поддерживаются операции:
Пример:
[
'interpolate',
['linear'],
['zoom'],
0, 'rgba(0,0,255,0.5)',
10, 'rgba(255,0,0,0.8)'
]
Фактически это векторная интерполяция в 4D пространстве цвета.
Любое стилевое свойство можно представить как функцию:
[ f(z, x, y) = value]
где:
Например, радиус точки:
[
'interpolate',
['exponential', 1.5],
['zoom'],
5, 2,
15, 20
]
Это степенная функция:
[ f(z) = a b^z]
Mapbox GL JS позволяет строить вложенные выражения, где результаты одной операции используются в другой:
[
'*',
['+', ['zoom'], 1],
['/', ['get', 'population'], 1000]
]
Это композиция функций:
[ f(z, p) = (z + 1) ]
Такие конструкции используются для data-driven styling, где геометрия и данные объединяются в единую модель вычислений.
При работе с кастомными слоями через WebGL API используются матрицы:
Итоговое преобразование:
[ MVP = P V M]
где:
Каждая вершина проходит через эту цепочку, превращаясь из географического пространства в экранное.
Векторные данные часто рассматриваются как наборы точек в многомерном пространстве:
Пример масштабирования:
[ (x’, y’) = s (x, y)]
Такие операции используются при динамической генерации геометрии и анимациях слоёв.