LatLngBounds представляет прямоугольную географическую
область, заданную двумя точками: юго-западной и северо-восточной. Этот
объект используется для описания рамок карты, ограничений отображения,
фильтрации объектов и вычисления видимой области.
Геометрически границы интерпретируются как осевая ограничивающая рамка (axis-aligned bounding box) в системе широты и долготы.
Основная идея:
L.latLngBounds(southWest, northEast)
Параметры:
southWest — юго-западная точкаnorthEast — северо-восточная точкаПример:
const sw = L.latLng(55.70, 37.50);
const ne = L.latLng(55.80, 37.70);
const bounds = L.latLngBounds(sw, ne);
При некорректном порядке координат Leaflet автоматически нормализует границы, корректируя минимальные и максимальные значения.
const bounds = L.latLngBounds([
[55.70, 37.50],
[55.75, 37.60],
[55.80, 37.70]
]);
В этом случае границы вычисляются как минимальный прямоугольник, содержащий все точки.
bounds.isValid()
Проверяет, содержит ли объект корректные координаты.
Возвращает:
true — если границы определеныfalse — если объект пустойПример:
const empty = L.latLngBounds();
empty.isValid(); // false
В Leaflet нет отдельного публичного isEmpty, но
поведение эквивалентно isValid() при отсутствии данных.
bounds.contains(latlng)
Проверяет, находится ли точка внутри границ.
const bounds = L.latLngBounds(
L.latLng(55.70, 37.50),
L.latLng(55.80, 37.70)
);
bounds.contains([55.75, 37.60]); // true
bounds.contains([55.90, 37.60]); // false
Логика:
bounds1.intersects(bounds2)
Проверяет пересечение двух прямоугольных областей.
const a = L.latLngBounds([55.70, 37.50], [55.80, 37.70]);
const b = L.latLngBounds([55.75, 37.60], [55.85, 37.80]);
a.intersects(b); // true
Используется для:
bounds.extend(latlng)
bounds.extend(otherBounds)
Расширяет границы так, чтобы включить новую точку или другую область.
const bounds = L.latLngBounds([55.70, 37.50], [55.75, 37.60]);
bounds.extend([55.80, 37.80]);
После вызова:
При расширении другим bounds:
bounds.extend(otherBounds);
bounds.getCenter()
Возвращает центр прямоугольника.
Формула:
const center = bounds.getCenter();
bounds.getSouthWest()
bounds.getNorthEast()
Возвращают соответствующие угловые точки.
const sw = bounds.getSouthWest();
const ne = bounds.getNorthEast();
bounds.getNorthWest()
bounds.getSouthEast()
Дополнительные углы прямоугольника.
bounds.toBBoxString()
Возвращает строку формата:
west,south,east,north
Пример:
"37.50,55.70,37.70,55.80"
Используется в:
bounds.pad(factor)
Увеличивает границы на процент от текущего размера.
const padded = bounds.pad(0.2);
Где:
0.2 означает увеличение на 20%Механика:
bounds.equals(otherBounds)
Проверяет полное совпадение границ.
bounds.equals(L.latLngBounds([55, 37], [56, 38]));
Сравнение включает:
const bounds = L.latLngBounds(
L.latLng(55.60, 37.30),
L.latLng(55.90, 37.90)
);
map.setMaxBounds(bounds);
Результат:
const group = L.featureGroup([marker1, marker2, marker3]);
map.fitBounds(group.getBounds());
Механизм:
const visible = points.filter(p =>
bounds.contains([p.lat, p.lng])
);
При работе с долготой:
Leaflet частично нормализует значения, но сложные случаи (например, Тихий океан) могут требовать дополнительной логики.
Новый объект без параметров:
const b = L.latLngBounds();
Поведение:
isValid() === falsegetCenter() могут возвращать некорректные
значения до добавления точекКаждый маркер имеет координаты, которые могут расширять bounds:
bounds.extend(marker.getLatLng());
const bounds = polygon.getBounds();
или
const bounds = polyline.getBounds();
map.getBounds()
Возвращает текущую видимую область карты как LatLngBounds.