Картографические проекции

Картографические проекции определяют способ преобразования географических координат (широта/долгота) в координаты экранного пространства или мировые координаты, используемые WebGL-рендерингом. В контексте deck.gl проекции являются фундаментальным слоем, связывающим данные, хранящиеся в системе координат WGS84, и визуальное представление на плоском экране.

Большинство геопространственных источников используют систему WGS84, где координаты задаются как:

  • долгота (longitude) в диапазоне от −180° до 180°
  • широта (latitude) в диапазоне от −85.05113° до 85.05113° (практическое ограничение Web Mercator)

Однако GPU-рендеринг в deck.gl работает в декартовом пространстве. Это требует преобразования сферических координат в плоские.

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

Web Mercator как стандарт де-факто

Наиболее распространённой проекцией в веб-картографии является Web Mercator, также известная как EPSG:3857.

Она используется в таких системах, как Mapbox, OpenStreetMap и Google Maps.

Формулы преобразования:

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

где:

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

Особенность: проекция не определена на полюсах, поэтому применяется отсечение широты.

В deck.gl эта модель используется как базовая при работе с MapView и WebMercatorViewport.

Модель координат в deck.gl

Внутренняя система координат deck.gl строится вокруг понятия viewport. В случае географических данных используется WebMercatorViewport, который выполняет двойное преобразование:

  1. WGS84 → Web Mercator (географическая проекция)
  2. Web Mercator → Clip Space (матричное преобразование камеры WebGL)

Таким образом, слой данных никогда не работает напрямую с пикселями экрана. Он оперирует либо:

  • географическими координатами (lat/lon)
  • мировыми координатами Web Mercator

Пример концептуального преобразования:

import {WebMercatorViewport} from '@deck.gl/core';

const viewport = new WebMercatorViewport({
  longitude: 37.6173,
  latitude: 55.7558,
  zoom: 10,
  width: 800,
  height: 600
});

const [x, y] = viewport.project([37.6173, 55.7558]);

Метод project переводит координаты в пиксельное пространство текущего viewport.

Zoom-уровни и нелинейная масштабируемость

В Web Mercator используется логарифмическая шкала масштабирования:

resolution = initialResolution / 2^zoom

Каждое увеличение zoom на 1 удваивает детализацию по осям X и Y.

Deck.gl синхронизирует это поведение с тайловыми системами (slippy maps), что позволяет совмещать векторные и растровые источники.

Анти-меридиан и непрерывность координат

Одной из сложных проблем картографической визуализации является разрыв на линии 180° долготы (анти-меридиан). В стандартной декартовой системе координат этот разрыв приводит к разрыву геометрии.

Deck.gl решает эту проблему на уровне геометрических утилит:

  • нормализация долготы в диапазон [-180, 180]
  • дублирование геометрий при пересечении границы
  • использование “wrapped world” в MapView

Это особенно важно для линий (PathLayer) и полигонов (PolygonLayer), где непрерывность критична.

Альтернативные проекции

Хотя Web Mercator является стандартом, deck.gl поддерживает и альтернативные системы координат через кастомные viewport’ы.

Orthographic projection

Используется для глобусов и 3D-отображения Земли. В отличие от Web Mercator, не имеет бесконечных искажений на полюсах, но ограничена видимой полусферой.

Cartesian (linear) coordinates

Используется в non-geospatial режимах, например:

  • визуализация графов
  • научные данные
  • indoor mapping

В этом режиме отсутствует географическая интерпретация координат.

Интеграция с WebGL матрицами

Проекции в deck.gl тесно связаны с матричной алгеброй. Каждая геометрия проходит через цепочку:

model matrix → view matrix → projection matrix

Web Mercator встраивается в projection matrix, обеспечивая переход от сферической модели к clip space.

Это позволяет GPU обрабатывать данные без дополнительной CPU-интерполяции.

Precision и проблема масштабов

При работе с глобальными координатами возникает проблема точности float32. На высоких zoom-уровнях (18+) различия в метрах могут теряться.

Deck.gl использует стратегию:

  • перевод координат в локальную систему вокруг viewport center
  • использование offset origin
  • разделение геометрии и трансформации

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

Взаимодействие с tile-системами

Web Mercator тесно связан с tile schema (XYZ tiles). Координаты переводятся в индексы тайлов:

xtile = floor((lon + 180) / 360 * 2^zoom) ytile = floor((1 - ln(tan(lat) + sec(lat)) / π) / 2 * 2^zoom)

Deck.gl использует это соответствие при работе с:

  • BitmapLayer
  • TileLayer
  • MVT (Mapbox Vector Tiles)

Геодезические линии и интерполяция

Прямые линии в географических координатах не являются прямыми в Web Mercator. Поэтому применяется геодезическая интерполяция:

  • Great Circle interpolation
  • сегментация линий по кривизне Земли
  • адаптивное увеличение числа сегментов при зуме

Это особенно важно для PathLayer и ArcLayer, где визуальная корректность зависит от формы проекции.

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

Обратное преобразование Web Mercator → WGS84 необходимо для:

  • обработчиков событий (pick / hover)
  • интерактивных инструментов
  • синхронизации с внешними GIS-системами

viewport.unproject([x, y]) возвращает исходные координаты, компенсируя нелинейные искажения проекции.

Согласование с 3D-сценой

В 3D-режиме deck.gl проекции расширяются до:

  • z-координаты высоты (elevation)
  • extrusion данных (здания, рельеф)
  • комбинированные модели terrain rendering

При этом Web Mercator остаётся базовой плоскостью, а высота добавляется как ортогональная ось, не влияющая на проекцию X/Y.

Роль проекций в архитектуре слоёв

Каждый слой deck.gl:

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

Таким образом, проекция является скрытым промежуточным уровнем между data model и rendering pipeline, обеспечивая единообразие всех визуальных компонентов.