Координатные системы

Deck.gl опирается на строгую модель координат, которая определяет, как географические и абстрактные данные преобразуются в сцену WebGL. Работа с координатами в этой библиотеке не сводится к простому отображению точек на карте: каждый слой (layer) может использовать собственную систему отсчёта, трансформации и проекцию, а вся сцена строится через унифицированный пайплайн преобразований.

Основой большинства сценариев является система LNGLAT (longitude/latitude) — географические координаты в градусах:

  • долгота (longitude) — X-ось, диапазон примерно от -180 до +180
  • широта (latitude) — Y-ось, диапазон примерно от -85 до +85

Эта система сама по себе не является евклидовой: расстояния искажаются при переходе к плоской карте. Поэтому она всегда требует проекции перед рендерингом.

В Deck.gl она используется как входная система координат для геопространственных данных: GeoJSON, маршрутов, точек интереса, тайлов.


Web Mercator и проекционный слой

Большинство картографических приложений опирается на Web Mercator (EPSG:3857) — стандарт де-факто для веб-карт.

Характерные особенности:

  • меридианы и параллели становятся прямыми линиями
  • масштаб зависит от широты
  • полюса обрезаются

В Deck.gl Web Mercator не используется напрямую как пользовательская система координат, но становится промежуточной стадией в проекциях через view-projection matrix.

Основная идея:

LNGLAT → Web Mercator → Clip Space → Screen Space


Координатная система слоя

Ключевой механизм управления координатами — параметр:

  • coordinateSystem

Он задаёт, как интерпретируются входные данные слоя.

Основные режимы:

LNGLAT

Используется по умолчанию для геоданных.

  • вход: [lon, lat]
  • интерпретация: географическая
  • преобразование: через проекцию карты

METER_OFFSETS

Система метровых смещений относительно точки опоры.

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

Пример поведения:

  • (0, 0, 0) — центр опорной точки
  • (1000, 0, 0) — 1 км на восток

LNGLAT_OFFSETS

Комбинированная система:

  • базовая точка в LNGLAT
  • смещения в метрах

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

CARTESIAN

Полностью абстрактная декартова система:

  • не зависит от карты
  • координаты интерпретируются как есть

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

  • научной визуализации
  • симуляциях
  • UI-оверлеях внутри WebGL-сцены

Опорная точка координат (coordinateOrigin)

При работе с большими географическими сценами возникает проблема потери точности float32 в WebGL. Для её решения используется смещение относительно опорной точки:

  • coordinateOrigin: [lon, lat, altitude]

Все координаты внутри слоя могут пересчитываться относительно этой точки.

Преимущества:

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

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

Внутри Deck.gl координаты проходят несколько этапов:

  1. User Space

    • входные данные слоя (GeoJSON, массивы координат)
  2. Model Space

    • локальная система слоя
  3. World Space

    • глобальная сцена карты
  4. View Space

    • камера (tilt, bearing, zoom)
  5. Clip Space

    • нормализованные координаты (-1 до 1)
  6. Screen Space

    • пиксели canvas

Каждый слой может участвовать в этом пайплайне по-разному, в зависимости от coordinateSystem.


Геометрические трансформации и матрицы

Deck.gl активно использует матрицы 4×4:

  • model matrix
  • view matrix
  • projection matrix

Итоговая трансформация:

position_screen = Projection * View * Model * position_world

Особенность геопространственных слоёв — наличие дополнительного географического преобразования до модели.


Проекция сферической модели

Для LNGLAT используется сферическая модель Земли:

  • долгота → угол вокруг оси Y
  • широта → угол от экватора
  • радиус ≈ 6371000 м

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


Работа с масштабом и zoom

В Deck.gl zoom влияет не только на камеру, но и на:

  • точность координат
  • уровень детализации слоёв
  • выбор тайлов
  • LOD (level of detail)

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

  • увеличивается масштаб world space
  • уменьшается область видимости
  • повышается плотность геометрии

Координаты при этом могут динамически пересчитываться через project() и unproject().


Проекционные функции project / unproject

Два ключевых инструмента:

project(lngLat)

Преобразует географические координаты в мировые:

  • вход: [lon, lat, z]
  • выход: [x, y, z] в world space

unproject(xyz)

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

  • из пикселей или world space в LNGLAT

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

  • обработки кликов
  • интерактивных сценариев
  • вычисления маршрутов

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

Помимо непрерывных координат, Deck.gl поддерживает дискретные сетки, например H3 indexing.

Особенности:

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

В этом случае геометрия строится через центр ячейки и её границы, а не через классические LNGLAT-пары.


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

При работе с картографическими слоями используется tile-based координатная структура:

  • z/x/y индексы тайлов
  • каждый тайл имеет собственную локальную систему координат
  • внутри тайла применяется нормализация 0..1

Deck.gl синхронизирует тайлы с глобальной системой через:

  • viewport transform
  • tile matrix

Координаты высоты и 3D сцена

Добавление третьей координаты (Z) расширяет модель до 3D:

  • altitude в метрах
  • или произвольная высота для CARTESIAN

В LNGLAT режиме высота интерпретируется как:

  • над уровнем земли (relative elevation)

В METER_OFFSETS:

  • абсолютное смещение по вертикали

Управление искажениями и precision

Проблема WebGL — ограниченная точность float32. Deck.gl решает её через:

  • локальные origin shifts
  • разбиение сцены на tiles
  • нормализацию координат

Дополнительно:

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

Координаты в шейдерах

В GPU координаты приходят уже трансформированными:

  • attribute position
  • uniform matrices
  • varying interpolations

Шейдеры оперируют:

  • clip space
  • screen space
  • local model space

Пример логики:

  • CPU готовит географические данные
  • GPU выполняет финальное преобразование

Смешанные системы координат в одном приложении

Deck.gl допускает одновременное использование нескольких систем:

  • один слой LNGLAT (геоданные)
  • другой CARTESIAN (анимации)
  • третий METER_OFFSETS (точные измерения)

Это достигается через изоляцию transform pipeline для каждого layer.


Преобразования в интерактивных сценариях

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

  1. screen pixel (click event)
  2. unproject → world space
  3. coordinateSystem mapping
  4. LNGLAT или CARTESIAN результат

Это позволяет:

  • определять точку клика на карте
  • выделять объекты
  • строить интерактивные маршруты

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

Некоторые слои (PathLayer, ScatterplotLayer) работают с массивами координат:

  • каждая точка преобразуется индивидуально
  • применяется batching в GPU
  • используются instanced attributes

Оптимизация:

  • минимизация CPU трансформаций
  • перенос вычислений в vertex shader

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

Для корректного наложения слоёв важно:

  • единая система координат
  • общий viewport
  • синхронизация projection matrix

Несовпадение систем приводит к:

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

Абстрактные координатные пространства

Помимо географии, Deck.gl активно используется для:

  • потоковых данных (flow maps)
  • графов (nodes/edges)
  • симуляций частиц

В этих случаях координаты теряют географический смысл и становятся:

  • относительными величинами
  • параметрами состояния системы
  • временными траекториями

Такая гибкость достигается через CARTESIAN и кастомные трансформации.