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

В основе всех вычислений в Leaflet лежит разделение пространственных координат на несколько уровней представления. Географические координаты (широта и долгота) существуют в сферической модели Земли, тогда как визуализация на экране опирается на декартову систему координат в пикселях. Между этими слоями располагается промежуточная мировая проекция, которая служит связующим звеном между географией и экраном.

Географическая точка задаётся как пара значений:

  • Latitude (широта) — положение по вертикали
  • Longitude (долгота) — положение по горизонтали

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


Проекционная модель Web Mercator

Leaflet по умолчанию использует систему координат EPSG:3857 (Web Mercator). Она переводит сферические координаты в плоское пространство, пригодное для тайловой карты.

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

  • Полюса географически искажаются
  • Экватор сохраняет линейную шкалу
  • Карта бесшовно делится на квадратные тайлы
  • Пространство становится пригодным для масштабирования через степени двойки

Преобразование происходит через проекцию:

[ x = R ] [ y = R (( + ))]

где:

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

Мировые координаты и пиксельная сетка

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

Размер мирового пространства зависит от уровня масштабирования:

[ worldSize = tileSize ^{zoom}]

Где:

  • tileSize обычно равен 256 пикселям
  • zoom — текущий уровень масштаба

Таким образом:

  • zoom 0 → 256×256 px
  • zoom 1 → 512×512 px
  • zoom 2 → 1024×1024 px
  • и так далее

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


Преобразование LatLng → Pixel Point

Leaflet выполняет преобразование в два этапа:

  1. Географические координаты → мировая проекция
  2. Мировая проекция → пиксель относительно карты

Основной метод:

map.project(latlng, zoom)

Он возвращает координаты в мировом пиксельном пространстве.

Далее применяется смещение относительно текущего центра карты:

map.latLngToLayerPoint(latlng)

Результат — точка в системе координат слоя (Layer Point), где:

  • начало координат (0, 0) соответствует левому верхнему углу текущего контейнера карты
  • значения изменяются при панорамировании и масштабировании

Координаты контейнера и слоя

Leaflet различает несколько уровней пиксельных координат:

Container Point

Координаты относительно DOM-контейнера карты:

map.latLngToContainerPoint(latlng)

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

  • учитывает CSS-смещения
  • зависит от положения карты на странице
  • используется для взаимодействия с HTML-элементами

Layer Point

Координаты внутри внутреннего слоя карты:

map.latLngToLayerPoint(latlng)

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

  • не зависит от внешнего DOM
  • используется для отрисовки вектора и тайлов
  • является базовой системой для SVG/Canvas слоёв

Мировые пиксели

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

map.project(latlng, zoom)

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


Смещение центра карты

Ключевой элемент трансформации — позиция центра карты. Все пиксельные координаты вычисляются относительно центра текущего view.

Пусть:

  • ( P_{world} ) — мировая точка
  • ( C_{world} ) — центр карты в мировых координатах

Тогда экранная точка:

[ P_{screen} = P_{world} - C_{world} + ]

где size — размер контейнера карты.

Это обеспечивает стабильное позиционирование при панорамировании.


Обратное преобразование Pixel → LatLng

Leaflet поддерживает обратное преобразование через:

map.unproject(point, zoom)

Процесс включает:

  1. Перевод пикселя в мировую систему
  2. Обратную Web Mercator проекцию
  3. Получение широты и долготы

Методы обратного преобразования:

map.layerPointToLatLng(point)
map.containerPointToLatLng(point)

Зависимость от масштаба (Zoom)

Каждый уровень zoom изменяет масштаб всей системы координат экспоненциально.

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

  • количество пикселей удваивается
  • детализация возрастает в 4 раза по площади
  • координатная сетка пересчитывается

Формально:

[ scale = 2^{zoom}]

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


Привязка к тайловой системе

Тайлы формируют основу отображения карты. Каждый тайл — квадрат 256×256 пикселей.

Позиция тайла вычисляется как:

[ tileX = ] [ tileY = ]

где ( x, y ) — мировые пиксельные координаты.

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

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

Практическое использование преобразований

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

  • размещение маркеров
  • отрисовка полилиний
  • позиционирование всплывающих окон
  • синхронизация пользовательских оверлеев

Каждый объект проходит через слой преобразований:

  1. LatLng → world coordinates
  2. world → layer point
  3. layer point → render (SVG/Canvas/DOM)

Геометрия на плоскости карты

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

Это позволяет применять стандартные алгоритмы:

  • вычисление расстояний в пикселях
  • проверка пересечений
  • кластеризация точек
  • вычисление bounding box

При этом географическая точность сохраняется за счёт обратного преобразования.


Особенности при разных CRS

Хотя Web Mercator является стандартом, Leaflet поддерживает альтернативные CRS.

При смене системы координат изменяются:

  • формулы проекции
  • масштабирование
  • поведение latLngToPoint
  • структура мирового пространства

Но интерфейс преобразований остаётся единым:

map.options.crs

Итоговая структура преобразований

Полный путь координаты:

LatLng → Projection → World Pixel → Layer Point → Screen

И обратный путь:

Screen → Layer Point → World Pixel → Projection → LatLng

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