Константы и перечисления

Библиотека Leaflet опирается на набор фиксированных строковых и объектных значений, которые формируют «неявные перечисления» внутри API. Они определяют поведение карты, контролов, слоёв, всплывающих элементов и систем координат. Эти значения не оформлены как классические enum-конструкции языка, но фактически выполняют их роль и используются во всех ключевых подсистемах.


Все перечисления и константы группируются внутри глобального пространства L. Внутри него значения представлены в виде:

  • строковых литералов (например, имена событий)
  • объектных словарей (например, L.CRS)
  • статических свойств классов (например, L.Control)
  • флагов окружения (L.Browser)

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


Системы координат (CRS)

Одним из наиболее значимых наборов констант является система координат CRS (Coordinate Reference System). Она определяет способ преобразования географических координат в пиксельные значения карты.

Основные предопределённые CRS

L.CRS.EPSG3857
L.CRS.EPSG4326
L.CRS.Simple

EPSG:3857

Используется по умолчанию в большинстве веб-карт. Основана на проекции Web Mercator.

  • поддерживает тайловые слои (XYZ)
  • обеспечивает совместимость с большинством картографических провайдеров
  • искажает площади на высоких широтах

EPSG:4326

Географическая система координат (широта/долгота без проекции).

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

Simple CRS

L.CRS.Simple

Используется для нетипичных карт:

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

Позиционирование контролов (L.ControlPosition)

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

'topleft'
'topright'
'bottomleft'
'bottomright'

Эти значения применяются во всех UI-компонентах:

L.control.zoom({ position: 'topright' })
L.control.scale({ position: 'bottomleft' })

Механика размещения основана на CSS-классах, которые генерируются динамически:

  • leaflet-top
  • leaflet-bottom
  • leaflet-left
  • leaflet-right

Комбинации этих классов формируют итоговую позицию элемента.


События карты и объектов

События в Leaflet представлены строковыми константами. Они не централизованы в виде enum, но образуют стабильный набор API-идентификаторов.

События карты

'load'
'click'
'dblclick'
'mousedown'
'mouseup'
'mousemove'
'zoomstart'
'zoomend'
'move'
'moveend'
'dragstart'
'drag'
'dragend'

Пример использования:

map.on('zoomend', function () {
    console.log(map.getZoom());
});

События слоёв

'add'
'remove'

События тайловых слоёв

'tileloadstart'
'tileload'
'tileerror'

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


Выравнивание всплывающих окон (Popup)

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

'top'
'bottom'
'center'
'left'
'right'
'topleft'
'topright'
'bottomleft'
'bottomright'

Применение:

L.popup({ offset: [0, -20], direction: 'top' })

Механика основана на вычислении смещения относительно anchor-точки слоя.


Подсказки (Tooltip direction)

Tooltip использует более ограниченный набор направлений:

'top'
'bottom'
'left'
'right'
'center'
'auto'

Особое значение auto позволяет автоматически выбирать оптимальное положение на основе границ viewport.


Флаги браузера (L.Browser)

Внутренний набор булевых констант определяет возможности браузера.

L.Browser.ie
L.Browser.edge
L.Browser.webkit
L.Browser.gecko
L.Browser.mobile
L.Browser.retina
L.Browser.touch
L.Browser.pointer

Эти флаги используются для:

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

Пример:

if (L.Browser.touch) {
    map.dragging.disable();
}

Типы рендереров (SVG / Canvas)

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

L.SVG
L.Canvas

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

  • способ отрисовки геометрии
  • производительность при большом количестве объектов
  • поддержку сложных эффектов (SVG) или высокую скорость (Canvas)

Пример явного выбора:

const map = L.map('map', { renderer: L.canvas() });

Иконки маркеров и стандартные значения

Маркерная система использует набор дефолтных параметров через L.Icon.Default.

Ключевые внутренние константы:

  • iconUrl
  • iconRetinaUrl
  • shadowUrl
  • iconSize
  • iconAnchor
  • popupAnchor

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

L.Icon.Default.mergeOptions({
    iconUrl: 'marker.png'
});

Константы слоёв

Слои в Leaflet имеют внутренние состояния и типовые идентификаторы, выраженные через события и флаги:

  • add / remove — жизненный цикл слоя
  • loading / load — состояние загрузки (в TileLayer)
  • tile — идентификатор тайловой сущности

TileLayer дополнительно использует параметры, которые фактически выступают как перечисления режимов:

{ tileSize: 256 }
{ zoomOffset: 0 }
{ detectRetina: true }

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

Хотя zoom не оформлен как enum, он работает как дискретная шкала:

  • минимальный zoom (minZoom)
  • максимальный zoom (maxZoom)
  • текущий zoom (getZoom())
map.setMinZoom(3);
map.setMaxZoom(18);

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


Константы взаимодействия с DOM

Внутренние утилиты L.DomEvent используют строковые идентификаторы событий браузера:

'click'
'dblclick'
'mousedown'
'mouseup'
'touchstart'
'touchend'
'keydown'
'keyup'

Также применяются модификаторы:

  • shiftKey
  • ctrlKey
  • altKey

Для работы с границами используются условные режимы:

  • pad
  • inside
  • outside

Применяются при работе с методами:

map.fitBounds(bounds, { padding: [20, 20] });

Обобщённая модель перечислений

Все перечисления в Leaflet можно классифицировать как:

  1. Строковые enum-подобные значения

    • события (click, zoomend)
    • позиции (topleft, bottomright)
    • направления (top, auto)
  2. Объектные реестры

    • CRS (L.CRS.*)
    • Browser flags (L.Browser.*)
  3. Статические классы

    • L.Control
    • L.Icon
    • L.SVG, L.Canvas
  4. Поведенческие флаги

    • detectRetina
    • touchZoom
    • dragging

Эта структура обеспечивает гибкость API без жёсткой типизации, сохраняя расширяемость и обратную совместимость.