Картографические проекции определяют способ преобразования географических координат (широта/долгота) в координаты экранного пространства или мировые координаты, используемые WebGL-рендерингом. В контексте deck.gl проекции являются фундаментальным слоем, связывающим данные, хранящиеся в системе координат WGS84, и визуальное представление на плоском экране.
Большинство геопространственных источников используют систему WGS84, где координаты задаются как:
Однако GPU-рендеринг в deck.gl работает в декартовом пространстве. Это требует преобразования сферических координат в плоские.
Классическая проблема: любое отображение сферы на плоскость неизбежно искажает либо площади, либо формы, либо расстояния. Поэтому выбор проекции определяется компромиссами между визуальной корректностью и вычислительной простотой.
Наиболее распространённой проекцией в веб-картографии является Web Mercator, также известная как EPSG:3857.
Она используется в таких системах, как Mapbox, OpenStreetMap и Google Maps.
Формулы преобразования:
x = R · λ y = R · ln(tan(π/4 + φ/2))
где:
Особенность: проекция не определена на полюсах, поэтому применяется отсечение широты.
В deck.gl эта модель используется как базовая при работе с
MapView и WebMercatorViewport.
Внутренняя система координат deck.gl строится вокруг понятия
viewport. В случае географических данных используется
WebMercatorViewport, который выполняет двойное
преобразование:
Таким образом, слой данных никогда не работает напрямую с пикселями экрана. Он оперирует либо:
Пример концептуального преобразования:
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.
В Web Mercator используется логарифмическая шкала масштабирования:
resolution = initialResolution / 2^zoom
Каждое увеличение zoom на 1 удваивает детализацию по осям X и Y.
Deck.gl синхронизирует это поведение с тайловыми системами (slippy maps), что позволяет совмещать векторные и растровые источники.
Одной из сложных проблем картографической визуализации является разрыв на линии 180° долготы (анти-меридиан). В стандартной декартовой системе координат этот разрыв приводит к разрыву геометрии.
Deck.gl решает эту проблему на уровне геометрических утилит:
Это особенно важно для линий (PathLayer) и полигонов (PolygonLayer), где непрерывность критична.
Хотя Web Mercator является стандартом, deck.gl поддерживает и альтернативные системы координат через кастомные viewport’ы.
Используется для глобусов и 3D-отображения Земли. В отличие от Web Mercator, не имеет бесконечных искажений на полюсах, но ограничена видимой полусферой.
Используется в non-geospatial режимах, например:
В этом режиме отсутствует географическая интерпретация координат.
Проекции в deck.gl тесно связаны с матричной алгеброй. Каждая геометрия проходит через цепочку:
model matrix → view matrix → projection matrix
Web Mercator встраивается в projection matrix, обеспечивая переход от сферической модели к clip space.
Это позволяет GPU обрабатывать данные без дополнительной CPU-интерполяции.
При работе с глобальными координатами возникает проблема точности float32. На высоких zoom-уровнях (18+) различия в метрах могут теряться.
Deck.gl использует стратегию:
Это позволяет поддерживать стабильность при высоком уровне детализации.
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 использует это соответствие при работе с:
Прямые линии в географических координатах не являются прямыми в Web Mercator. Поэтому применяется геодезическая интерполяция:
Это особенно важно для PathLayer и ArcLayer, где визуальная корректность зависит от формы проекции.
Обратное преобразование Web Mercator → WGS84 необходимо для:
viewport.unproject([x, y]) возвращает исходные координаты, компенсируя нелинейные искажения проекции.
В 3D-режиме deck.gl проекции расширяются до:
При этом Web Mercator остаётся базовой плоскостью, а высота добавляется как ортогональная ось, не влияющая на проекцию X/Y.
Каждый слой deck.gl:
Таким образом, проекция является скрытым промежуточным уровнем между data model и rendering pipeline, обеспечивая единообразие всех визуальных компонентов.