Контейнер карты в Leaflet задаётся обычным DOM-элементом, которому назначается идентификатор и фиксированная высота. Без этого элемента и корректных размеров инициализация карты невозможна, поскольку библиотека рассчитывает геометрию отображения на основе размеров контейнера.
Карта создаётся внутри элемента, например:
<div id="map"></div>
Критическим требованием является наличие высоты через CSS:
#map {
height: 500px;
width: 100%;
}
При отсутствии высоты контейнера Leaflet создаёт объект карты, но визуальный слой остаётся пустым, поскольку рендеринг тайлов привязан к вычисленным пикселям области отображения.
Основной объект библиотеки — L.map. Он создаёт экземпляр
карты и связывает его с DOM-элементом:
const map = L.map('map');
Первичная инициализация без дополнительных параметров создаёт карту с нулевым центром и минимальным масштабом, что практически всегда требует последующей настройки состояния.
Чаще используется сразу установка центра и масштаба:
const map = L.map('map').setView([51.505, -0.09], 13);
Параметр setView принимает:
[lat, lng]Механика Leaflet строится на Web Mercator (EPSG:3857), поэтому координаты интерпретируются в географической системе широты и долготы, а затем проецируются в пиксельное пространство тайлов.
Карты Leaflet не содержат визуальных данных без слоя тайлов. Базовый
слой подключается через L.tileLayer:
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© OpenStreetMap contributors'
}).addTo(map);
URL содержит шаблонные параметры:
{s} — поддомен (a, b, c) для балансировки нагрузки{z} — уровень масштаба{x}, {y} — координаты тайлаОпции слоя определяют поведение загрузки и ограничения:
maxZoom — максимальный доступный масштабminZoom — минимальный масштабattribution — строка атрибуции источника данныхtileSize — размер тайла (по умолчанию 256)opacity — прозрачность слояconst map = L.map('map', {
center: [55.751244, 37.618423],
zoom: 10,
zoomControl: true,
attributionControl: true
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© OpenStreetMap contributors'
}).addTo(map);
В отличие от setView, параметры center и
zoom передаются напрямую в конфигурацию конструктора.
Объект инициализации карты поддерживает широкий набор опций, влияющих на поведение интерфейса и взаимодействия:
zoomControl — отображение кнопок масштабированияattributionControl — отображение блока атрибуцииclosePopupOnClick — закрытие всплывающих окон при клике
по картеboxZoom — масштабирование прямоугольникомdoubleClickZoom — масштабирование двойным кликомdragging — перетаскивание картыconst map = L.map('map', {
zoomControl: false,
doubleClickZoom: false,
dragging: true
});
maxBounds — ограничение перемещения карты в пределах
координатminZoom и maxZoom — диапазон
масштабовconst bounds = [
[40.0, -74.0],
[41.0, -73.0]
];
const map = L.map('map', {
maxBounds: bounds,
minZoom: 10,
maxZoom: 16
});
maxBounds особенно важен при создании карт регионов, где
выход за пределы логически нежелателен.
По умолчанию используется EPSG3857:
const map = L.map('map', {
crs: L.CRS.EPSG3857
});
Для нестандартных проекций возможно использование:
L.CRS.EPSG4326 (географическая система)L.ProjИзменение CRS полностью влияет на расчёт тайлов и геометрию слоёв.
После создания объекта доступно множество методов управления:
map.setView([48.8566, 2.3522], 12);
Также возможно раздельное управление:
map.setZoom(14);
map.setCenter([48.8566, 2.3522]);
В Leaflet фактически используется setView, а отдельные
методы являются обёртками.
map.flyTo([48.8566, 2.3522], 12);
или
map.panTo([48.8566, 2.3522]);
flyTo добавляет анимацию перемещения и изменения
масштаба, учитывая траекторию между текущим и целевым состоянием.
Leaflet вычисляет размеры карты один раз при инициализации. При изменении DOM (например, открытии модального окна или изменении layout) требуется пересчёт:
map.invalidateSize();
Без этого метода возможны артефакты отображения тайлов и смещение центра.
Расширенный вариант с анимацией:
map.invalidateSize(true);
Карта генерирует события жизненного цикла:
map.on('load', () => {
// карта загружена
});
Другие важные события:
zoomend — завершение изменения масштабаmoveend — завершение перемещенияresize — изменение размеров контейнераlayeradd — добавление слояmap.on('moveend', () => {
const center = map.getCenter();
});
При динамическом создании интерфейсов карта может быть уничтожена:
map.remove();
Удаление освобождает обработчики событий и очищает DOM-структуру, созданную Leaflet внутри контейнера.
Leaflet поддерживает множественные экземпляры:
const map1 = L.map('map1').setView([51.5, -0.09], 13);
const map2 = L.map('map2').setView([48.8, 2.35], 12);
Каждый объект полностью изолирован по состоянию, слоям и событиям, однако общие ресурсы тайлового сервера могут влиять на производительность при большом количестве экземпляров.
Без CSS-высоты карта не отображается, хотя объект успешно создаётся.
Если карта создаётся внутри скрытого элемента
(display: none), размеры вычисляются некорректно, что
требует вызова invalidateSize после отображения.
Leaflet ожидает порядок [lat, lng]. Обратный порядок
приводит к смещению карты в неправильную точку.
Создание второй карты на том же DOM-элементе без удаления первой приводит к конфликту состояния:
map.remove();
const map = L.map('map');
Для оптимизации загрузки и отрисовки применяются параметры:
preferCanvas: true — использование Canvas вместо SVG
для векторных слоёвupdateWhenIdle: true — обновление тайлов после
завершения движенияkeepBuffer — увеличение буфера тайлов вокруг видимой
областиconst map = L.map('map', {
preferCanvas: true,
updateWhenIdle: true
});
Canvas-рендеринг особенно эффективен при большом количестве геометрических объектов.
Комбинация ограничений часто используется для фиксации области интереса:
const map = L.map('map', {
minZoom: 11,
maxZoom: 16,
maxBounds: [
[55.0, 37.0],
[56.0, 38.0]
]
});
Такое ограничение предотвращает выход за пределы заданного региона и снижает нагрузку на сервер тайлов.
Хотя слои обычно добавляются после создания карты, возможно их предварительное подключение:
const osm = L.tileLayer(url, options);
const map = L.map('map', {
layers: [osm]
});
Это позволяет сразу задать базовую карту без дополнительного вызова
.addTo(map).
Leaflet позволяет задавать фиксированную точку обзора:
const map = L.map('map', {
center: [59.93, 30.33],
zoom: 10,
zoomSnap: 1,
zoomDelta: 1
});
zoomSnap — шаг округления масштабаzoomDelta — шаг изменения при кнопках управленияЭти параметры влияют на дискретность взаимодействия пользователя с картой.
При приближении до максимального уровня масштабирования Leaflet останавливает загрузку новых тайлов и фиксирует текущее состояние. При этом возможно отображение пустых областей, если сервер не предоставляет данные для максимального zoom.