Работа с проекциями

Web Mercator как базовая система координат

В Mapbox GL JS по умолчанию используется проекция Web Mercator (EPSG:3857), которая преобразует сферические координаты земли в плоскую карту. Это решение исторически связано с совместимостью веб-картографических систем и высокой скоростью рендеринга тайлов.

Web Mercator основан на цилиндрической проекции, где долгота преобразуется линейно, а широта — через логарифмическую функцию:

x = R y = R (( + ))

где:

  • ( ) — долгота
  • ( ) — широта
  • ( R ) — радиус Земли в модели

Ключевое ограничение Web Mercator заключается в искажении площадей: чем ближе к полюсам, тем сильнее растяжение объектов. Именно поэтому Гренландия на карте выглядит сопоставимой с Африкой, хотя фактически различие кратно.

В Mapbox GL JS эта проекция используется не только для отображения тайлов, но и как внутренняя система координат для всех слоёв, источников и взаимодействий.


Управление проекцией карты

Mapbox GL JS поддерживает переключение между несколькими встроенными проекциями. Основные из них:

  • mercator — классическая Web Mercator
  • globe — трёхмерный глобус

Проекция задаётся на уровне карты через конфигурацию:

const map = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v12',
  center: [30, 50],
  zoom: 2,
  projection: 'mercator'
});

Изменение проекции возможно динамически:

map.setProjection('globe');

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


Глобальная проекция Globe

Проекция globe реализует трёхмерную модель Земли с перспективной отрисовкой. В отличие от Web Mercator, здесь отсутствует бесконечное растяжение по вертикали: поверхность замыкается в сферу.

Ключевые особенности:

  • отсутствие искажений площадей на глобальном уровне
  • корректное отображение антиподов
  • поддержка атмосферы и освещения
  • взаимодействие с наклоном и вращением камеры

Внутри движка используется сферическая модель, где координаты переводятся в декартову систему:

x = R y = R z = R

Эта модель позволяет отрисовывать карту как физически корректную сферу, на которую накладываются векторные и растровые данные.


Различия Mercator и Globe в поведении карты

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

Web Mercator:

  • бесконечная горизонтальная повторяемость (wrap-around)
  • фиксированная двумерная плоскость
  • линейная интерполяция координат
  • высокая производительность рендеринга

Globe:

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

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


Настройка проекции через style specification

Помимо API, проекция может задаваться через стиль карты:

const map = new mapboxgl.Map({
  container: 'map',
  style: {
    version: 8,
    projection: {
      name: 'globe'
    },
    sources: {},
    layers: []
  }
});

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


Влияние проекции на источники данных

Все источники данных в Mapbox GL JS — GeoJSON, vector tiles, raster tiles — интерпретируются в рамках текущей проекции.

GeoJSON остаётся в географических координатах (WGS84), но визуальное преобразование происходит на уровне рендера. Это означает, что:

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

Векторные тайлы особенно чувствительны к проекции, поскольку их координаты уже предагрегированы. При смене проекции происходит перерасчёт экранного пространства и пересэмплирование геометрии.


Поведение слоёв в разных проекциях

Разные типы слоёв по-разному реагируют на смену проекции:

  • fill / line / circle — полностью поддерживаются в обеих проекциях
  • symbol layers — требуют дополнительной обработки ориентации
  • raster layers — наиболее стабильны, так как работают с изображениями
  • 3D extrusion layers — в Globe получают дополнительную перспективу

Особое внимание требуется при работе с текстовыми слоями: при переходе в Globe текст может менять угол наклона и поведение якорей.


Камера и проекционные трансформации

Проекция тесно связана с моделью камеры. В Mapbox GL JS камера определяется через:

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

В Globe-проекции появляется дополнительная зависимость от радиуса сферы. Это влияет на интерпретацию zoom: он становится не просто масштабированием, а приближением к поверхности сферы.

При увеличении pitch в Globe камера начинает работать как орбитальная система, вращающаяся вокруг центра Земли.


Ограничения Web Mercator и необходимость альтернатив

Web Mercator остаётся стандартом благодаря совместимости, но имеет фундаментальные ограничения:

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

Globe-проекция частично решает эти проблемы, но вводит новые ограничения:

  • более высокая нагрузка на GPU
  • сложность работы с пиксельной точностью
  • необходимость пересчёта освещения

Переключение проекций во время работы приложения

Динамическая смена проекции требует учёта состояния камеры:

map.on('load', () => {
  document.getElementById('switch').addEventListener('click', () => {
    const current = map.getProjection();
    map.setProjection(current === 'globe' ? 'mercator' : 'globe');
  });
});

При переключении важно учитывать:

  • сохранение центра карты
  • адаптацию zoom-уровня
  • корректировку pitch и bearing

Без этих корректировок визуальная сцена может резко сместиться.


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

Несмотря на смену проекции, входные координаты остаются в стандартной географической системе (долгота/широта). Это позволяет использовать единый формат данных:

const point = {
  type: 'Feature',
  geometry: {
    type: 'Point',
    coordinates: [69.6, 42.3]
  }
};

Однако интерпретация расстояний и направлений зависит от проекции. В Mercator расстояния искажены, тогда как в Globe они ближе к геодезическим.


Взаимодействие с 3D-ландшафтом и освещением

В Globe-проекции появляется дополнительная визуальная модель освещения:

  • направление источника света
  • интенсивность диффузного отражения
  • атмосферное рассеивание

Эти параметры создают эффект физической планеты. При этом геометрия слоёв остаётся прежней, но освещение влияет на восприятие высот и контуров.


Производительность и оптимизация при смене проекции

Переключение между Mercator и Globe требует перерасчёта большого количества данных на GPU. Оптимизация достигается через:

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

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


Геометрические преобразования и матрицы проекции

Внутри Mapbox GL JS каждая проекция описывается через матрицы преобразования. Для перехода из географических координат в экранные используется последовательность:

P_{screen} = M_{projection} M_{camera} P_{world}

где:

  • ( P_{world} ) — исходные координаты
  • ( M_{camera} ) — матрица камеры
  • ( M_{projection} ) — матрица проекции

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


Кастомные проекции и расширяемость

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

При этом любые нестандартные проекции требуют учёта:

  • соответствия тайловой сетке
  • корректного отображения границ мира
  • стабильности при зуме и вращении
  • согласованности с системой координат WGS84

Реализация таких решений обычно строится на промежуточной трансформации GeoJSON перед передачей в источник данных или на кастомных слоях рендеринга.