Понимание системы координат

В MapLibre GL JS основой всей геометрии является система географических координат, в которой положение точки задаётся парой значений долгота/широта. Используется порядок [longitude, latitude], что принципиально отличается от привычного математического представления координат как (x, y).

  • Longitude (долгота) — горизонтальная ось, диапазон от −180° до +180°
  • Latitude (широта) — вертикальная ось, диапазон от −85.0511° до +85.0511° в Web Mercator

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

GeoJSON, используемый в MapLibre GL JS, строго придерживается формата:

{
  "type": "Point",
  "coordinates": [30.5, 50.45]
}

где первым элементом всегда идёт долгота.

Проекционная модель Web Mercator

В основе MapLibre GL JS лежит проекция Web Mercator (EPSG:3857). Это цилиндрическая проекция, которая преобразует сферические координаты Земли в плоскую декартову систему координат.

Преобразование выполняется по формулам:

[ x = R ]

[ y = R (( + ))]

где:

  • ( ) — долгота в радианах
  • ( ) — широта в радианах
  • ( R ) — радиус Земли в модели (обычно 6378137 м)

Особенности проекции

  • Полюса не достижимы (значение y стремится к бесконечности)
  • Масштаб увеличивается к северу и югу
  • Углы сохраняются локально, но площади искажаются
  • Прямые линии на карте не являются геодезическими

Тайловая система координат

MapLibre GL JS использует схему slippy map tiles, где мир разбивается на квадратные тайлы фиксированного размера (обычно 256×256 пикселей).

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

[ n = 2^z]

где:

  • ( z ) — уровень зума
  • ( n ) — количество тайлов по оси

Координаты тайла вычисляются как:

[ x_{tile} = ^z ]

[ y_{tile} = ^z ]

Эта система обеспечивает согласованное разбиение мира на квадратные блоки независимо от уровня приближения.

Пространство карты и координаты сцены

MapLibre GL JS работает с несколькими уровнями координатных пространств:

Географическое пространство (lng/lat)

Исходные координаты данных. Используются в слоях, источниках и GeoJSON.

Проекционное пространство (Web Mercator)

После преобразования координаты становятся линейными значениями в метрах.

Мировое пиксельное пространство (world coordinates)

Используется для отрисовки тайлов и геометрии на текущем зуме.

[ worldSize = tileSize ^z]

где tileSize обычно равен 512 или 256 пикселей.

Экранное пространство (screen coordinates)

Финальная система координат, в которой выполняется рендеринг WebGL.

Преобразование проходит цепочку:

lng/lat → Web Mercator → world pixels → screen pixels

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

Внутренний рендер MapLibre GL JS опирается на матричные преобразования, где каждая точка проходит через серию трансформаций:

  • projection matrix (проекция мира на плоскость камеры)
  • view matrix (позиция камеры: центр, zoom, bearing, pitch)
  • model matrix (геометрия объекта)

Вектор координат в однородных координатах:

[ P_{screen} = M_{projection} M_{view} M_{model} P_{world}]

Эта цепочка позволяет реализовать поворот карты, наклон и плавное масштабирование без потери согласованности данных.

Уровни зума и непрерывная система масштабирования

В MapLibre GL JS zoom является непрерывной величиной, а не дискретной. Это означает, что между целыми уровнями зума существуют промежуточные состояния.

Масштаб сцены определяется как:

[ scale = 2^z]

где ( z ) может быть дробным числом, например 10.35.

Это обеспечивает плавное увеличение и уменьшение карты без скачков между тайловыми уровнями.

Оборачивание мира и антимеридиан

Мировая модель MapLibre GL JS предполагает бесконечную горизонтальную прокрутку. Это реализуется через повторение координат по оси долготы.

Основной механизм:

  • долгота нормализуется в диапазон [-180°, 180°]
  • при выходе за пределы происходит wrap-around
  • тайлы дублируются по оси X

Антимеридиан (±180°) не является разрывом визуально, хотя в географическом смысле это граница системы координат.

Поворот и наклон карты

MapLibre GL JS поддерживает:

  • bearing — вращение карты вокруг оси Z
  • pitch — наклон камеры

При этом координаты объектов не изменяются, изменяется только матрица вида.

При наклоне происходит переход от ортографической модели к перспективной, где дальние объекты визуально уменьшаются:

[ x’ = , y’ = ]

(упрощённое представление перспективного деления)

Локальные координаты слоёв

Каждый слой может использовать собственное преобразование геометрии, но базовая система остаётся глобальной.

Типичные источники данных:

  • GeoJSON (геометрия в lng/lat)
  • vector tiles (предпроецированные координаты)
  • raster tiles (изображения без геометрии)

Vector tiles часто используют нормализованную систему координат внутри тайла:

  • диапазон x: 0–4096
  • диапазон y: 0–4096

Это позволяет масштабировать геометрию независимо от глобальной проекции.

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

MapLibre GL JS предоставляет API для конвертации координат:

  • map.project(lngLat) — перевод в экранные координаты
  • map.unproject(point) — обратное преобразование
  • map.transform — доступ к внутреннему состоянию матрицы

Пример преобразования:

const lngLat = [30.5, 50.45];
const point = map.project(lngLat);

Результат зависит от текущего zoom, pitch и bearing.

Погрешности и численная стабильность

При высоких уровнях зума возникают особенности:

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

MapLibre GL JS использует техники:

  • перерасчёт origin (recenter world)
  • относительные координаты относительно центра камеры
  • сегментация пространства на тайлы

Итоговая модель координатного пространства

Система координат MapLibre GL JS представляет собой многослойную трансформационную модель, где географические координаты проходят через цепочку преобразований:

  1. Географическая система (lng/lat)
  2. Проекция Web Mercator
  3. Мировая тайловая система
  4. Камерное пространство
  5. Экранное пространство WebGL

Каждый уровень добавляет собственные свойства: от глобальной географии до пиксельной точности отрисовки.