Преобразование систем координат

В основе работы с картой в Mapbox GL JS лежит постоянное преобразование координат между несколькими пространственными системами: географической (долгота/широта), проекционной (плоской картой) и экранной (пиксели холста). Эти преобразования определяют всё — от размещения маркеров до отрисовки слоёв и вычисления геометрии взаимодействия с пользователем.

Ключевая концепция состоит в том, что данные хранятся в одной системе координат, визуализируются в другой, а взаимодействие пользователя происходит в третьей. Переходы между ними являются непрерывным процессом внутри render-loop карты.


Географическая система координат (WGS84)

Базовая система координат в Mapbox GL JS — WGS84, где каждая точка задаётся парой:

  • долгота (longitude)
  • широта (latitude)

Формат представления:

[longitude, latitude]

Пример:

[69.2401, 53.2145]

Эта система используется:

  • во всех GeoJSON-данных
  • при создании источников (sources)
  • при указании центра карты
  • при работе с API событий

Координаты в WGS84 являются угловыми величинами, измеряемыми в градусах, и не могут быть напрямую отображены на плоскости без проекции.


Проекционная система координат Web Mercator

Основная внутренняя система отображения в Mapbox GL JS — Web Mercator, также известная как EPSG:3857.

Web Mercator projection

Эта проекция преобразует сферические координаты в плоские, используя следующие свойства:

  • меридианы становятся параллельными прямыми
  • искажения возрастают к полюсам
  • экватор сохраняет масштаб почти без искажений

Математическая идея базируется на преобразовании:

  • долготы → линейное смещение по оси X
  • широты → логарифмическое преобразование по оси Y

Формально:

x = R * λ
y = R * ln(tan(π/4 + φ/2))

где:

  • λ — долгота в радианах
  • φ — широта в радианах
  • R — радиус Земли в модели

Экранная система координат (pixel space)

После проекции данные переходят в экранное пространство, где:

  • начало координат находится в верхнем левом углу canvas
  • ось X направлена вправо
  • ось Y направлена вниз
  • единицы измерения — пиксели

Экранные координаты зависят от:

  • zoom уровня
  • pitch и bearing
  • размера canvas
  • текущей матрицы преобразования камеры

Архитектура преобразований в Mapbox GL JS

Mapbox GL JS использует каскадную модель трансформаций:

WGS84 (lon/lat)
    ↓
Web Mercator (projected world coordinates)
    ↓
Tile coordinates (zoom-dependent grid)
    ↓
Clip space (WebGL normalized coordinates)
    ↓
Screen coordinates (pixels)

Каждый слой этого пайплайна обслуживается отдельными компонентами:

  • геометрический трансформер источников данных
  • tile-pipeline
  • camera transform
  • WebGL projection matrices

Объект LngLat и внутренние преобразования

Координаты в пользовательском API представлены объектом:

const point = new mapboxgl.LngLat(69.2401, 53.2145);

Этот объект выполняет роль контейнера для географических координат и предоставляет методы для:

  • нормализации значений
  • проверки диапазонов
  • конверсии в массив

При передаче в систему рендеринга происходит автоматическое преобразование в projected space.


Методы преобразования координат

project()

Преобразует географическую координату в пиксельную относительно текущего состояния камеры.

const pixel = map.project([69.2401, 53.2145]);

Результат:

{
  x: number,
  y: number
}

Применяется:

  • для позиционирования HTML-оверлеев
  • для вычисления попаданий (hit-testing)
  • для динамических визуальных эффектов

unproject()

Обратное преобразование: из экранных координат в географические.

const lngLat = map.unproject({ x: 300, y: 200 });

Используется для:

  • обработки кликов мыши
  • построения интерактивных геометрий
  • определения координат под курсором

Матрица камеры и глобальные трансформации

Внутренний механизм Mapbox GL JS основан на матрицах преобразования 4×4, объединяющих:

  • масштаб (zoom)
  • поворот (bearing)
  • наклон (pitch)
  • смещение центра

Обобщённо:

M_total = M_projection × M_camera × M_model

Где:

  • M_projection — Web Mercator + перспективная проекция
  • M_camera — параметры камеры
  • M_model — локальные трансформации слоя

Эта система позволяет:

  • плавно анимировать карту
  • поддерживать 3D-эффекты
  • корректно обрабатывать tilt и rotation

Tile-координаты и система z/x/y

Карты разбиваются на тайлы:

/{z}/{x}/{y}

где:

  • z — уровень масштаба
  • x — индекс по горизонтали
  • y — индекс по вертикали

Каждый тайл представляет собой квадрат фиксированного размера (обычно 512 или 256 пикселей в логическом пространстве).

Преобразование координат в тайлы:

  • долгота → нормализованный X
  • широта → нормализованный Y
  • масштабирование по zoom

Влияние zoom на систему координат

Zoom является ключевым параметром, влияющим на все уровни трансформации.

При увеличении zoom:

  • увеличивается детализация тайлов
  • изменяется масштаб мирового пространства
  • пересчитывается матрица камеры

Математически:

scale = 2^zoom

Это означает экспоненциальное увеличение масштаба, где каждый следующий уровень zoom удваивает размер отображаемого пространства.


Перспективная и ортографическая проекция

В Mapbox GL JS применяется гибридная модель:

  • базовая проекция — Web Mercator
  • визуальная трансформация — перспективная камера

Перспектива проявляется через:

  • pitch (наклон карты)
  • vanishing point
  • изменение масштаба объектов по глубине

При pitch = 0 карта становится ортографической, и преобразования упрощаются до двумерных.


Координаты событий и hit-testing

При обработке событий (click, mousemove) используется обратная цепочка преобразований:

  1. экранные координаты события
  2. преобразование в clip space
  3. восстановление world coordinates
  4. сопоставление с геометрией слоя

Это позволяет точно определять:

  • клик по линии
  • попадание в полигон
  • взаимодействие с символами

Преобразование GeoJSON в экранное пространство

Данные GeoJSON проходят последовательность:

  • нормализация координат
  • проекция в Web Mercator
  • разбиение по тайлам
  • трансформация вершин в экранные координаты

Каждая вершина обрабатывается отдельно, но с общими матричными параметрами камеры, что обеспечивает согласованность отображения.


Интерполяция и плавные переходы координат

При анимации:

  • центр карты интерполируется по сфере
  • zoom интерполируется логарифмически
  • bearing интерполируется по кратчайшему углу

Особое внимание уделяется:

  • анти-мерцанию при переходе через antimeridian (±180°)
  • корректной интерполяции полярных областей

Обратная совместимость систем координат

В Mapbox GL JS поддерживаются различные стандарты входных данных:

  • EPSG:4326 (WGS84)
  • GeoJSON (де-факто WGS84)
  • Web Mercator (внутреннее представление)

Все они приводятся к единой внутренней модели, что позволяет:

  • унифицировать источники данных
  • избегать ручных преобразований
  • обеспечивать предсказуемую визуализацию

Ошибки и искажения при преобразованиях

Основные источники искажений:

  • полярная деформация Web Mercator
  • численная погрешность при высоких zoom
  • округления при переводе в пиксели
  • накопление ошибок при анимациях

Особенно заметны:

  • растяжение объектов ближе к полюсам
  • смещение при больших масштабах
  • дрейф при длительных анимациях камеры

Практическая модель внутреннего pipeline

Обобщённая модель преобразования координат:

GeoJSON → LngLat → Mercator → Tile → Camera → Screen → DOM/WebGL

И обратный путь:

Screen → Camera inverse → Mercator inverse → LngLat

Эта двунаправленная система делает возможным:

  • интерактивное редактирование геометрии
  • синхронизацию UI с картой
  • точные вычисления пространственных операций