Класс L.LatLngBounds представляет прямоугольную
географическую область на карте, ограниченную юго-западной и
северо-восточной точками. Внутри Leaflet этот класс используется для
вычисления видимой области карты, подгонки отображения под набор
объектов, проверки пересечений и множества пространственных
операций.
Параллельно существует класс L.Bounds, который работает
в пиксельных координатах (L.Point) и применяется внутри
системы рендеринга тайлов, слоёв и DOM-позиционирования. Оба класса
концептуально схожи, но оперируют разными системами координат.
L.LatLngBounds описывает прямоугольник на поверхности
Земли через две крайние точки:
Эти точки определяют минимальные и максимальные значения широты и долготы.
Базовая форма создания:
const bounds = L.latLngBounds(
L.latLng(55.70, 37.50), // SW
L.latLng(55.80, 37.70) // NE
);
Возможен альтернативный вариант через массив координат:
const bounds = L.latLngBounds([
[55.70, 37.50],
[55.75, 37.60],
[55.80, 37.70]
]);
Во втором случае границы вычисляются автоматически на основе всех точек.
Метод extend увеличивает область, включая новые точки
или другие границы.
bounds.extend([55.85, 37.65]);
const b1 = L.latLngBounds([55.70, 37.50], [55.75, 37.60]);
const b2 = L.latLngBounds([55.76, 37.61], [55.80, 37.70]);
b1.extend(b2);
После выполнения b1 охватывает обе области.
Класс предоставляет методы для доступа к границам:
bounds.getSouthWest();
bounds.getNorthEast();
bounds.getNorthWest();
bounds.getSouthEast();
Каждый метод возвращает объект LatLng.
Метод getCenter() вычисляет географический центр
прямоугольника:
const center = bounds.getCenter();
Это полезно для центрирования карты или размещения маркера.
Метод contains определяет, находится ли точка внутри
границ:
bounds.contains([55.76, 37.62]);
Возвращает true или false.
Метод intersects проверяет, пересекаются ли две
области:
const a = L.latLngBounds([55.70, 37.50], [55.75, 37.60]);
const b = L.latLngBounds([55.74, 37.59], [55.80, 37.70]);
a.intersects(b);
Используется при фильтрации видимых объектов.
Границы считаются валидными только если определены обе точки:
bounds.isValid();
Если границы были созданы пустыми или не расширены — результат будет
false.
Метод pad увеличивает границы на процент от их
размера:
const padded = bounds.pad(0.2);
Значение 0.2 увеличивает область на 20% во всех
направлениях. Это часто используется для подгрузки объектов за пределами
экрана.
Одна из ключевых возможностей Leaflet — автоматическое позиционирование карты под область:
map.fitBounds(bounds);
Этот метод масштабирует и центрирует карту так, чтобы вся область была видна.
Дополнительные параметры:
map.fitBounds(bounds, {
padding: [20, 20],
maxZoom: 15
});
Границы могут использоваться как ограничитель:
map.setMaxBounds(bounds);
Карта не позволит пользователю выйти за пределы указанной области.
LatLngBounds всегда нормализует координаты:
При пересечении антимеридиана (±180° долготы) поведение требует особого внимания, так как долготы “перепрыгивают” через границу диапазона.
Часто создаются пустые границы, которые затем расширяются:
const bounds = L.latLngBounds();
points.forEach(p => bounds.extend(p));
Такой подход используется при обработке массивов геоданных.
При наличии набора маркеров:
const bounds = L.latLngBounds(
markers.map(m => m.getLatLng())
);
map.fitBounds(bounds);
Или динамическое расширение:
markers.forEach(m => bounds.extend(m.getLatLng()));
Границы можно использовать для пространственной логики:
Пример фильтрации:
const visible = points.filter(p =>
bounds.contains(p.latlng)
);
L.Bounds используется внутри системы рендеринга и
работает с L.Point.
const b = new L.Bounds(
new L.Point(0, 0),
new L.Point(256, 256)
);
Расширяет область:
b.extend(new L.Point(300, 100));
Возвращает размер прямоугольника:
b.getSize(); // Point(width, height)
Центр в пиксельных координатах:
b.getCenter();
Проверка точки:
b.contains(new L.Point(150, 150));
b1.intersects(b2);
Используется при отрисовке тайлов и слоёв, чтобы определить необходимость рендера.
При загрузке карты каждый тайл имеет собственные пиксельные границы.
L.Bounds помогает:
LatLngBounds работает в географических координатах, а
Bounds — в пикселях. Между ними существует преобразование
через проекцию:
Это разделение позволяет Leaflet сохранять независимость логики карты и визуального слоя.
const bounds = L.latLngBounds(dataPoints);
map.fitBounds(bounds);
map.setMaxBounds(
L.latLngBounds([55.7, 37.5], [55.8, 37.7])
);
if (map.getBounds().contains(marker.getLatLng())) {
// объект видим
}
if (!tileBounds.intersects(mapBounds)) {
return;
}
При зуме LatLngBounds остаётся неизменным, но его
пиксельное представление (Bounds) пересчитывается каждый
раз. Это обеспечивает согласованность данных при любом масштабе
карты.
При передаче массива координат порядок не важен:
L.latLngBounds([
[55.8, 37.7],
[55.7, 37.5],
[55.75, 37.65]
]);
Leaflet автоматически вычисляет минимальные и максимальные значения.
При работе с GeoJSON и векторными слоями:
const geoBounds = geoJsonLayer.getBounds();
map.fitBounds(geoBounds);
Это позволяет автоматически адаптировать карту под сложные геометрии, включая полигоны и мультиполигоны.