В задачах картографии часто возникает необходимость работать не с отдельным объектом на карте, а с набором объектов как с единой сущностью. Такой набор может включать маркеры, поли-линии, полигоны или комбинированные слои. В этом контексте ключевым инструментом становится получение границ всей группы слоёв — вычисление минимального ограничивающего прямоугольника (bounding box), который охватывает все элементы группы.
В Leaflet для этого используется механизм слоёв-групп и метод
getBounds(), который позволяет агрегировать геометрию
дочерних объектов.
Leaflet строит архитектуру карты вокруг слоёв:
L.LayerGroup служит контейнером для любых слоёв, но не
гарантирует наличие геометрических методов.
L.FeatureGroup расширяет LayerGroup и
добавляет геометрические операции, включая:
Ключевой метод для работы с группами:
const group = L.featureGroup([marker1, marker2, polygon]);
const bounds = group.getBounds();
Метод возвращает объект LatLngBounds, который
содержит:
Эти две точки формируют прямоугольник, полностью охватывающий все элементы группы.
При вызове getBounds() происходит обход всех дочерних
слоёв:
Проверяется наличие геометрии у слоя
Извлекаются координаты:
Вычисляются минимальные и максимальные значения широты и долготы
Формируется итоговый bounding box
const map = L.map('map').setView([0, 0], 2);
const marker1 = L.marker([55.75, 37.61]);
const marker2 = L.marker([59.93, 30.33]);
const marker3 = L.marker([56.84, 60.61]);
const group = L.featureGroup([marker1, marker2, marker3]);
group.addTo(map);
const bounds = group.getBounds();
map.fitBounds(bounds);
Метод:
map.fitBounds(bounds);
Если группа не содержит слоёв:
const group = L.featureGroup();
group.getBounds();
результат — пустой LatLngBounds, который может не
содержать валидных координат. Это важно учитывать перед вызовом
fitBounds.
Проверка:
if (group.getLayers().length > 0) {
map.fitBounds(group.getBounds());
}
| Свойство | LayerGroup | FeatureGroup |
|---|---|---|
| getBounds | отсутствует | есть |
| геометрические операции | нет | есть |
| работа с событиями | ограничена | расширенная |
Если требуется вычисление границ, предпочтительно использовать
FeatureGroup.
GeoJSON-слои автоматически поддерживают вычисление границ через внутренние FeatureGroup.
const geojson = L.geoJSON(data);
const bounds = geojson.getBounds();
map.fitBounds(bounds);
Особенность:
Иногда требуется объединить несколько независимых групп.
const group1 = L.featureGroup([marker1, marker2]);
const group2 = L.featureGroup([marker3, marker4]);
const bounds = group1.getBounds().extend(group2.getBounds());
map.fitBounds(bounds);
bounds.extend(otherBounds);
FeatureGroup рекурсивно обходит вложенные структуры:
const innerGroup = L.featureGroup([marker1, marker2]);
const outerGroup = L.featureGroup([innerGroup, marker3]);
outerGroup.getBounds();
Все координаты внутренних групп учитываются автоматически.
При тысячах объектов вычисление bounds может стать затратным.
Практики оптимизации:
Пример кэширования:
let cachedBounds = null;
function getGroupBounds(group) {
if (!cachedBounds) {
cachedBounds = group.getBounds();
}
return cachedBounds;
}
Если группа изменяется:
group.addLayer(newMarker);
group.removeLayer(oldMarker);
границы нужно пересчитывать:
map.fitBounds(group.getBounds());
При автоматическом масштабировании карты часто добавляют отступ:
map.fitBounds(group.getBounds(), {
padding: [20, 20]
});
Это предотвращает «прилипание» объектов к краям экрана.
getBounds() отсутствует — возникает ошибка.
Карта может перейти в некорректное состояние.
Bounds вызываются до полной загрузки данных.