Работа с границами (bounds) в Leaflet является ключевым аспектом при построении интерактивных карт: от автоматического масштабирования до ограничения области перемещения и вычисления видимых объектов. Границы в Leaflet представлены объектом LatLngBounds, который описывает прямоугольную область на карте по координатам юго-западной и северо-восточной точек.
В основе всех операций лежит класс LatLngBounds, представляющий прямоугольник в географических координатах.
Основная структура:
Создание границ:
const bounds = L.latLngBounds(
L.latLng(55.70, 37.50),
L.latLng(55.80, 37.70)
);
Также допустим массив координат:
const bounds = L.latLngBounds([
[55.70, 37.50],
[55.80, 37.70]
]);
Одним из наиболее часто используемых методов является получение текущих видимых границ карты.
Метод возвращает объект LatLngBounds, соответствующий текущей области отображения:
const mapBounds = map.getBounds();
Особенности:
Пример использования:
map.on('moveend', () => {
const bounds = map.getBounds();
console.log(bounds.getSouthWest(), bounds.getNorthEast());
});
Многие векторные слои имеют метод получения собственных границ.
Применимо к:
const polygon = L.polygon([
[55.70, 37.50],
[55.75, 37.60],
[55.80, 37.55]
]);
const bounds = polygon.getBounds();
Особенность: Метод вычисляет минимальный прямоугольник, охватывающий все вершины геометрии.
Группы объектов могут агрегировать границы всех вложенных элементов:
const group = L.featureGroup([marker1, polygon, polyline]);
const bounds = group.getBounds();
Это особенно важно при работе с динамически добавляемыми слоями.
Метод подгоняет масштаб и центр карты под заданные границы:
map.fitBounds(bounds);
Расширенные параметры:
map.fitBounds(bounds, {
padding: [20, 20],
maxZoom: 15,
animate: true
});
Ключевые параметры:
padding — отступы от краёв картыmaxZoom — ограничение максимального приближенияanimate — анимация переходаПример с группой объектов:
const group = L.featureGroup([marker1, marker2, marker3]);
map.fitBounds(group.getBounds());
Позволяет динамически увеличивать область:
const bounds = L.latLngBounds();
bounds.extend([55.70, 37.50]);
bounds.extend([55.80, 37.70]);
bounds.extend([55.75, 37.65]);
Каждый вызов расширяет прямоугольник так, чтобы включить новую точку.
Практическое применение:
Проверяет, находится ли точка внутри прямоугольника:
const inside = bounds.contains([55.75, 37.60]);
Возвращает:
true — точка внутриfalse — вне областиПрименение:
Проверяет пересечение двух областей:
const result = bounds1.intersects(bounds2);
Используется для:
const sw = bounds.getSouthWest();
const ne = bounds.getNorthEast();
Каждый метод возвращает объект LatLng.
Дополнительно:
console.log(sw.lat, sw.lng);
console.log(ne.lat, ne.lng);
Метод возвращает строку формата:
west,south,east,north
Пример:
const str = bounds.toBBoxString();
Используется при:
Позволяет ограничить область перемещения карты:
map.setMaxBounds(bounds);
После установки пользователь не сможет выйти за пределы заданного прямоугольника.
Дополнительные особенности:
Снятие ограничения:
map.setMaxBounds(null);
Создаёт увеличенную копию границ:
const padded = bounds.pad(0.2);
Параметр:
Применение:
if (bounds.isValid()) {
console.log('Границы корректны');
}
Границы считаются невалидными, если:
Частый сценарий — получение данных по текущей области карты:
map.on('moveend', () => {
const b = map.getBounds();
const params = {
west: b.getWest(),
south: b.getSouth(),
east: b.getEast(),
north: b.getNorth()
};
fetch('/api/objects?' + new URLSearchParams(params));
});
Это позволяет:
Можно объединять массив точек или bounds:
const b1 = L.latLngBounds([55.7, 37.5], [55.8, 37.6]);
const b2 = L.latLngBounds([55.75, 37.55], [55.85, 37.65]);
const combined = L.latLngBounds([b1, b2]);
Также через extend:
const combined = L.latLngBounds();
combined.extend(b1);
combined.extend(b2);