В библиотеке Leaflet значительная часть логики вынесена в набор утилитарных модулей и вспомогательных классов. Они обеспечивают единообразную работу с координатами, DOM-элементами, событиями, геометрией и внутренними преобразованиями. Эти инструменты не привязаны к конкретным слоям карты, но формируют основу для их корректного функционирования.
Модуль L.Util содержит набор универсальных функций,
используемых внутри всей библиотеки.
Одной из ключевых функций является L.Util.extend,
обеспечивающая поверхностное копирование свойств:
L.Util.extend(target, source1, source2);
Функция последовательно копирует свойства из источников в целевой объект. Используется для объединения опций и конфигураций слоёв.
L.Util.bind фиксирует контекст выполнения функции:
var bound = L.Util.bind(fn, context);
Функция полезна при работе с обработчиками событий, где важно сохранить ссылку на объект слоя или карты.
Каждому объекту Leaflet может быть присвоен уникальный идентификатор
через L.Util.stamp:
var id = L.Util.stamp(object);
Идентификатор сохраняется внутри объекта и используется для быстрого доступа в коллекциях и индексах.
Функция L.Util.setOptions стандартизирует применение
параметров:
L.Util.setOptions(instance, options);
Она объединяет дефолтные настройки класса и пользовательские параметры, сохраняя единый формат конфигурации по всей библиотеке.
Для работы с географическими координатами часто применяется
wrapNum:
L.Util.wrapNum(value, range, includeMax);
Функция приводит число к заданному диапазону, например, долготу к интервалу [-180, 180].
L.Util.formatNum ограничивает точность чисел:
L.Util.formatNum(num, precision);
Используется для уменьшения погрешностей при вычислениях координат.
L.Util.falseFn возвращает функцию, всегда возвращающую
false. Применяется как безопасный обработчик по
умолчанию.
L.Util.requestAnimFrame обеспечивает кроссбраузерный
доступ к requestAnimationFrame:
L.Util.requestAnimFrame(callback, context, immediate);
Используется для плавных анимаций перемещения карты и слоёв.
Модуль L.DomUtil инкапсулирует операции над
DOM-элементами, минимизируя прямое использование нативного API.
var el = L.DomUtil.get(id);
var div = L.DomUtil.create(tagName, className, container);
create позволяет сразу задавать класс и родительский
элемент, упрощая построение слоёв интерфейса.
L.DomUtil.addClass(el, 'active');
L.DomUtil.removeClass(el, 'active');
L.DomUtil.hasClass(el, 'active');
Операции работают с кроссбраузерной нормализацией классов.
Leaflet использует абсолютное позиционирование для слоёв:
L.DomUtil.setPosition(el, point);
var pos = L.DomUtil.getPosition(el);
Координаты задаются в пикселях относительно контейнера карты.
L.DomUtil.toFront(el);
L.DomUtil.toBack(el);
Функции изменяют z-index DOM-элементов, влияя на порядок отображения слоёв.
Для предотвращения обработки событий используются:
L.DomUtil.disableClickPropagation(el);
L.DomUtil.disableScrollPropagation(el);
Они блокируют всплытие событий кликов и прокрутки до карты.
Модуль L.DomEvent стандартизирует работу с браузерными
событиями.
L.DomEvent.on(el, 'click', handler);
L.DomEvent.off(el, 'click', handler);
Поддерживается регистрация нескольких обработчиков и контекстов выполнения.
Leaflet нормализует поведение событий мыши и касаний, объединяя их в единый интерфейс.
L.DomEvent.stopPropagation(e);
L.DomEvent.preventDefault(e);
L.DomEvent.stop(e);
stop комбинирует оба действия, предотвращая стандартное
поведение браузера и всплытие события.
L.DomEvent.disableClickPropagation(el);
L.DomEvent.disableScrollPropagation(el);
Используются для UI-элементов поверх карты (панели, контролы), чтобы они не перехватывали события карты.
Модуль L.Browser содержит флаги, определяющие поддержку
функций браузера.
Типичные свойства:
L.Browser.ieL.Browser.mobileL.Browser.touchL.Browser.geckoL.Browser.webkitL.Browser.androidL.Browser.retinaЭти флаги используются для адаптации поведения интерфейса и оптимизации отрисовки.
Представляет координаты в пикселях:
var p = L.point(10, 20);
Методы:
add, subtractmultiplyBydivideBydistanceToroundИспользуется для позиционирования элементов на экране.
Географическая точка:
var latlng = L.latLng(55.75, 37.61);
Методы:
distanceTo(latlng)equals(latlng)toString()Ограничивающий прямоугольник:
var bounds = L.latLngBounds([sw, ne]);
Основные операции:
extend(latlng)getCenter()contains(latlng)intersects(bounds)Используется для определения видимой области карты.
L.Bounds работает аналогично LatLngBounds,
но в пиксельной системе координат.
var b = new L.Bounds(point1, point2);
Методы:
extend(point)getSize()getBottomLeft()getTopRight()Класс L.Transformation отвечает за перевод
географических координат в пиксельные и обратно.
var tr = new L.Transformation(a, b, c, d);
Формулы преобразования:
Используется в проекциях карты для масштабирования и сдвига координат.
Модуль оптимизирует операции над полилиниями.
Основные функции:
simplify(points, tolerance)pointToSegmentDistance(p, p1, p2)clipSegment(a, b, bounds)simplify уменьшает количество точек в линии, сохраняя
форму, что важно для производительности при отображении сложных
геометрий.
Работает с замкнутыми фигурами.
Основные операции:
Leaflet использует цепочку преобразований:
LatLng — географические координатыProjection — проекция на плоскостьTransformation — масштабированиеPoint — экранные координатыЭта цепочка обеспечивает независимость от конкретной карты и позволяет легко менять системы координат.
Вспомогательные функции активно применяются для оптимизации:
stampDomUtilBrowser для отключения тяжёлых
эффектовЭти механизмы позволяют Leaflet оставаться лёгкой библиотекой при работе с большими наборами геоданных.