Единицы измерения

В библиотеке MapLibre GL JS система единиц измерения не является однородной: она распределена между географическими координатами, экранными пикселями, условными мировыми координатами проекции и параметрами камеры. Понимание того, в какой системе выражено каждое значение, критично для корректной работы со стилями, источниками данных и камерой карты.

Базовая система координат — это долгота и широта в градусах:

  • Долгота (longitude): диапазон от -180 до 180
  • Широта (latitude): диапазон от -85.0511 до 85.0511 (ограничение проекции)

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

Ключевая особенность: градусы здесь не являются линейной метрикой расстояния. Один градус долготы на экваторе и один градус в высоких широтах соответствуют разным физическим расстояниям.


Проекция Web Mercator и мировые координаты

Внутри рендеринга используется проекция Web Mercator projection. Она переводит сферические координаты в плоское пространство.

После преобразования появляются world coordinates:

  • единица измерения — условные “метры” Web Mercator
  • диапазон по оси X и Y примерно от -20037508.34 до 20037508.34
  • центр карты соответствует (0, 0)

Важно: эти “метры” не являются физическими метрами. Это математическая проекция, позволяющая равномерно отображать карту на плоскости.


Экранные пиксели как основная единица рендеринга

На уровне отображения ключевой единицей становятся пиксели:

  • толщина линий (line-width)
  • размеры символов (text-size)
  • отступы и смещения (*-translate)
  • радиусы кругов (circle-radius)

Пиксель в MapLibre GL JS — это логический пиксель, привязанный к устройству отображения, но масштабируемый через DPR (device pixel ratio).

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


Масштабирование и zoom как безразмерная величина

Параметр zoom не имеет физической размерности:

  • zoom = 0 — вся Земля на экране
  • каждый следующий уровень увеличивает масштаб в 2 раза

Это логарифмическая шкала:

  • увеличение zoom на 1 = увеличение детализации в 2 раза
  • уменьшение zoom на 1 = уменьшение в 2 раза

Таким образом, zoom связывает мировые координаты и экранные пиксели.


Плотность пикселей и метры на пиксель

Понятие meters per pixel используется косвенно через вычисления:

  • зависит от широты
  • зависит от zoom
  • зависит от проекции Web Mercator

На экваторе при zoom 0 один пиксель соответствует огромному расстоянию, тогда как при zoom 20 — доли метра.

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


Тайлы и их размерность

В основе рендеринга лежит тайловая сетка:

  • стандартный размер тайла: 512×512 или 256×256 пикселей
  • каждый тайл соответствует участку мира в координатной сетке zoom/x/y

Тайлы формируют дискретную структуру, где:

  • zoom определяет уровень детализации
  • x и y определяют положение в сетке

Таким образом, вся карта разбивается на равномерные пиксельные блоки, независимо от реальных расстояний.


Единицы стилей: layout и paint свойства

В стиле MapLibre GL JS существует разделение на две группы свойств:

Layout свойства

Работают на этапе размещения объектов:

  • text-field, symbol-placement
  • text-size
  • icon-size

Здесь используются:

  • пиксели
  • безразмерные коэффициенты
  • иногда условные единицы (например, множители)

Paint свойства

Определяют визуализацию:

  • line-width
  • fill-opacity
  • circle-radius

Основная единица — пиксель, но значения могут быть интерполированы по zoom.


Интерполяция и zoom-dependent значения

Одна из ключевых особенностей — масштабирование свойств по zoom:

  • линейная интерполяция
  • ступенчатые функции (stops)
  • экспоненциальное масштабирование

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

  • при zoom 10 линия может быть 1px
  • при zoom 15 — 4px

Это создаёт эффект «физического» увеличения объектов при приближении.


Камера: углы и безразмерные параметры

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

  • bearing — градусы (0–360)
  • pitch — градусы (0–85)
  • zoom — безразмерный логарифмический масштаб

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


Смешение мировых и экранных систем

MapLibre GL JS одновременно оперирует несколькими слоями единиц:

  1. Географические координаты (градусы)
  2. Мировые координаты Web Mercator (условные метры)
  3. Экранные пиксели
  4. Логарифмический zoom
  5. Угловые параметры камеры (градусы)

Каждая система используется строго в своём контексте и не подменяет другую.


Векторные данные и нормализация координат

Источники данных (GeoJSON, vector tiles) всегда хранят геометрию в географических координатах. При рендеринге происходит трансформация:

  • из WGS84 → Web Mercator
  • из мировых координат → экранных пикселей

При этом геометрия остаётся неизменной, меняется только представление.


Нормализация размеров объектов

Размеры объектов в MapLibre GL JS не привязаны к физическим единицам:

  • линия толщиной 1px остаётся 1px на любом zoom
  • но может масштабироваться через zoom expressions
  • символы могут быть привязаны к экрану, а не к миру

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


Контраст между географическими и экранными единицами

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

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


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

Система измерений в MapLibre GL JS формируется как многоуровневая модель:

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

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