CRS: системы отсчёта

В основе любой картографической библиотеки лежит механизм преобразования географических координат в плоскую систему координат экрана. Leaflet использует абстракцию CRS (Coordinate Reference System), которая определяет, как широта и долгота преобразуются в пиксели, тайлы и внутренние координаты карты.

CRS в Leaflet определяет три ключевых аспекта: тип проекции, единицы измерения и правила масштабирования. Все вычисления положения объектов на карте происходят через выбранную систему координат.


Базовая модель координат Leaflet

Leaflet оперирует двумя основными пространствами:

  • Географические координаты: широта (lat), долгота (lng)
  • Пиксельные координаты карты: внутренняя система отображения

Преобразование между ними осуществляется через CRS:

  • latlng → point (проекция на плоскость)
  • point → latlng (обратное преобразование)

Эти операции лежат в основе всех взаимодействий с картой: позиционирования маркеров, тайлов, оверлеев и событий.


CRS.EPSG3857 (Web Mercator)

По умолчанию Leaflet использует CRS, основанную на проекции Web Mercator:

map = L.map('map', {
    crs: L.CRS.EPSG3857
});

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

  • Используется сферическая версия Меркатора
  • Координаты представлены в метрах
  • Поддерживается большинством тайловых сервисов (OpenStreetMap, Google Maps-подобные системы)
  • Полюса географически искажены и фактически “обрезаны”

Математическая основа

Проекция преобразует широту следующим образом:

  • Долгота линейно отображается по оси X
  • Широта проходит через логарифмическое преобразование

Это позволяет сохранить углы, но искажает площади на высоких широтах.

Причины доминирования EPSG:3857

  • Стандарт для веб-картографии
  • Тайловая система легко делится на квадраты
  • Простая работа с масштабами через степени двойки
  • Совместимость с большинством API картографических сервисов

CRS.EPSG4326 (географическая система)

Альтернативная система координат — EPSG:4326:

map = L.map('map', {
    crs: L.CRS.EPSG4326
});

Характеристики

  • Использует градусы широты и долготы напрямую
  • Отсутствует сложная проекция
  • Карта не использует Web Mercator и работает в “плоском” представлении

Особенности поведения

  • Тайловые слои должны быть специально подготовлены
  • Масштабирование ведёт себя иначе, чем в EPSG:3857
  • Используется реже из-за несовместимости с большинством тайловых серверов

L.CRS.Simple: плоская система координат

Для изображений, схем и негеографических карт применяется простая CRS:

map = L.map('map', {
    crs: L.CRS.Simple
});

Принцип работы

  • Координаты интерпретируются как пиксели
  • Нет географической проекции
  • Ось Y направлена вниз (как в компьютерной графике)

Применение

  • Игровые карты
  • Чертежи
  • План помещений
  • Загруженные изображения (floor plans, схемы)

Пример настройки изображения

const bounds = [[0, 0], [1000, 1000]];

const map = L.map('map', {
    crs: L.CRS.Simple
});

L.imageOverlay('floor.png', bounds).addTo(map);

map.fitBounds(bounds);

Внутреннее устройство CRS

CRS в Leaflet — это объект, реализующий набор методов:

  • latLngToPoint(latlng, zoom)
  • pointToLatLng(point, zoom)
  • project(latlng)
  • unproject(point)
  • scale(zoom)
  • zoom(scale)

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


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

Проекция (project)

const point = map.options.crs.project(L.latLng(55.75, 37.61));

Проекция переводит географические координаты в координаты внутренней системы CRS.

Обратное преобразование (unproject)

const latlng = map.options.crs.unproject(L.point(1000000, 500000));

Используется при обработке кликов, перетаскивания и вычислении положения объектов.


Масштабирование и уровни зума

CRS определяет, как изменяется масштаб карты при увеличении zoom level.

В Web Mercator используется правило:

[ = 2^{zoom}]

Это означает:

  • каждый следующий уровень увеличивает детализацию в 2 раза
  • размер карты растёт экспоненциально

В Leaflet это отражается через метод:

L.CRS.EPSG3857.scale = function (zoom) {
    return 256 * Math.pow(2, zoom);
};

Тайловая система и CRS

Тайлы напрямую зависят от CRS, так как определяют:

  • сетку разбиения карты
  • координаты тайлов
  • систему индексации (x, y, zoom)

В EPSG:3857 используется схема:

/z/x/y.png

Где:

  • z — уровень зума
  • x — колонка тайла
  • y — строка тайла

CRS определяет, как географическая точка попадает в этот индекс.


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

Каждый CRS задаёт точку начала координат (origin).

Для EPSG:3857:

  • origin находится в левом верхнем углу мира
  • координаты возрастают вправо и вниз

Для L.CRS.Simple:

  • origin зависит от пользовательских данных
  • часто задаётся вручную через bounds

Кастомные CRS

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

const customCRS = L.extend({}, L.CRS.EPSG3857, {
    transformation: new L.Transformation(0.5, 0, -0.5, 0)
});

const map = L.map('map', {
    crs: customCRS
});

Transformation

Объект L.Transformation задаёт линейное преобразование:

x' = a * x + b
y' = c * y + d

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

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

CRS и bounds карты

Система координат тесно связана с границами карты:

map.setMaxBounds([
    [-85, -180],
    [85, 180]
]);

CRS определяет, как эти границы интерпретируются:

  • в EPSG:3857 границы ограничены из-за искажений на полюсах
  • в EPSG:4326 используются прямые градусы
  • в Simple CRS границы задаются в пикселях

Пиксельная модель и CRS

Leaflet внутри оперирует не географией, а пикселями.

Каждая точка карты имеет:

  • pixel coordinate (x, y)
  • zoom level
  • transformation matrix CRS

Маркер, линия или полигон проходят цепочку преобразований:

latlng → projected point → world pixel → tile grid → screen pixel

Сравнение CRS систем

EPSG:3857

  • стандарт веб-картографии
  • поддержка тайловых серверов
  • искажение на полюсах

EPSG:4326

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

L.CRS.Simple

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

Поведение объектов при смене CRS

При смене CRS все слои пересчитываются:

  • маркеры изменяют позицию через project/unproject
  • тайлы перезапрашиваются с новой схемой координат
  • оверлеи масштабируются по новой системе

Некорректная смена CRS без соответствующих тайлов приводит к смещению или отсутствию отображения слоёв.


Геометрические вычисления в CRS

Leaflet использует CRS для:

  • вычисления расстояний на карте
  • определения центра карты
  • расчёта bounds объектов
  • интерполяции линий

В EPSG:3857 расстояния не соответствуют реальным на высоких широтах, что влияет на измерения.


CRS и производительность

Выбор CRS влияет на:

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

EPSG:3857 оптимизирован для производительности благодаря степенному росту сетки и предсказуемой структуре тайлов.


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

При использовании кастомных CRS важно учитывать:

  • соответствие тайловой схемы
  • корректность transformation
  • масштабирование zoom levels
  • совместимость с overlay слоями

Несовпадение этих параметров приводит к разрыву геометрии карты и визуальным артефактам.