В библиотеке Leaflet управление масштабом реализовано через набор
методов, работающих с уровнем zoom-карты: setZoom,
zoomIn и zoomOut. Эти функции являются основой
программного контроля приближения и отдаления карты, дополняя
интерактивные механизмы (колесо мыши, кнопки масштабирования, жесты на
сенсорных устройствах).
Метод setZoom устанавливает конкретный уровень масштаба
карты.
map.setZoom(zoom, options);
0–18, но фактический
диапазон зависит от конфигурации тайлового слоя.setZoom напрямую задаёт абсолютное значение масштаба.
Если переданный уровень выходит за пределы minZoom или
maxZoom, он автоматически ограничивается этими
значениями.
Ключевое отличие от других методов заключается в отсутствии относительного изменения — значение всегда интерпретируется как конечное состояние.
map.setZoom(12, {
animate: true
});
Основные параметры options:
При включённой анимации переход между уровнями zoom выполняется через интерполяцию матрицы преобразования карты, а не мгновенной заменой тайлов.
const map = L.map('map').setView([51.505, -0.09], 10);
map.setZoom(14);
В этом случае карта сразу переходит на уровень масштабирования 14, сохраняя текущий центр.
Метод zoomIn увеличивает масштаб карты на фиксированное
значение шага.
map.zoomIn(delta, options);
zoomDelta из настроек
карты.zoomIn не устанавливает конкретный уровень, а изменяет
текущий:
currentZoom + delta
Если итоговое значение превышает maxZoom, оно
ограничивается допустимым максимумом.
map.zoomIn();
map.zoomIn(2, {
animate: true
});
Первый вызов использует стандартный шаг. Второй увеличивает масштаб сразу на два уровня с анимацией.
Метод zoomOut выполняет обратное действие — уменьшает
уровень масштаба.
map.zoomOut(delta, options);
Фактическое значение рассчитывается как:
currentZoom - delta
Если результат ниже minZoom, применяется
ограничение.
map.zoomOut();
map.zoomOut(3, {
animate: true,
duration: 0.5
});
| Метод | Тип изменения | Характеристика |
|---|---|---|
| setZoom | абсолютное | фиксирует конкретный уровень |
| zoomIn | относительное | увеличивает масштаб |
| zoomOut | относительное | уменьшает масштаб |
setZoom используется для синхронизации состояния карты с
внешними данными, тогда как zoomIn и zoomOut
применяются для инкрементального управления.
Каждая карта имеет параметры:
minZoommaxZoomL.map('map', {
minZoom: 5,
maxZoom: 18
});
При любом изменении масштаба через setZoom,
zoomIn или zoomOut значения автоматически
нормализуются в пределах заданного диапазона.
Параметр zoomSnap влияет на дискретность
масштабирования:
L.map('map', {
zoomSnap: 1
});
При zoomSnap: 1 переходы происходят только по целым
уровням. При меньших значениях (например, 0.5) допускаются
промежуточные масштабы.
Методы setZoom, zoomIn,
zoomOut учитывают это поведение при вычислении итогового
значения.
zoomDelta определяет шаг изменения при вызове
zoomIn() и zoomOut() без параметров:
L.map('map', {
zoomDelta: 0.5
});
Тогда:
zoomIn() → +0.5zoomOut() → −0.5Любое изменение zoom инициирует цепочку событий:
zoomstart — начало изменения масштабаzoom — промежуточные изменения при анимацииzoomend — завершение измененияПример регистрации:
map.on('zoomstart', () => {
console.log('Начало масштабирования');
});
map.on('zoomend', () => {
console.log('Масштабирование завершено');
});
Метод setView(latlng, zoom) объединяет установку центра
и масштаба:
map.setView([51.505, -0.09], 13);
Фактически внутри происходит вызов логики, эквивалентной:
map.setZoom(13);
map.panTo([51.505, -0.09]);
При этом setZoom остаётся автономным способом изменения
только уровня масштаба без изменения центра карты.
При изменении zoom:
Плавность зависит от:
function focusOnArea(map, bounds) {
map.fitBounds(bounds);
map.setZoom(map.getZoom() + 1);
}
function resetZoom(map) {
map.setZoom(10, { animate: true });
}
function zoomStep(map, direction) {
if (direction === 'in') {
map.zoomIn();
} else {
map.zoomOut();
}
}
setZoom подряд могут приводить к
визуальным рывкам.