Границы карты (Map Bounds) в Leaflet определяют географическую область, которая отображается или может отображаться в окне карты. Границы задаются двумя координатами:
На основе этих координат формируется прямоугольная область, внутри которой располагается интересующая территория.
Границы используются для решения множества задач:
Для работы с границами Leaflet предоставляет класс
L.LatLngBounds.
Создание объекта выполняется следующим образом:
const bounds = L.latLngBounds(
[55.70, 37.50],
[55.90, 37.80]
);
Либо через массив координат:
const bounds = [
[55.70, 37.50],
[55.90, 37.80]
];
Первая точка представляет юго-западный угол прямоугольника, вторая — северо-восточный.
Схематически область выглядит следующим образом:
Север
↑
NW ┌──────────────┐ NE
│ │
│ Bounds │
│ │
SW └──────────────┘ SE
↓
Юг
Для визуального отображения границ используется прямоугольник.
const bounds = [
[55.70, 37.50],
[55.90, 37.80]
];
L.rectangle(bounds, {
color: "blue",
weight: 2
}).addTo(map);
В результате на карте появится прямоугольная область, соответствующая заданным координатам.
Метод fitBounds() позволяет изменить центр и масштаб
карты таким образом, чтобы указанная область полностью поместилась в
видимой части окна.
const bounds = [
[55.70, 37.50],
[55.90, 37.80]
];
map.fitBounds(bounds);
После вызова метода Leaflet автоматически вычисляет:
Это один из наиболее часто используемых методов при работе с границами.
Часто необходимо показать все маркеры независимо от их расположения.
const markers = [
L.marker([55.75, 37.61]),
L.marker([55.80, 37.70]),
L.marker([55.68, 37.55])
];
const group = L.featureGroup(markers);
group.addTo(map);
map.fitBounds(group.getBounds());
Метод getBounds() вычисляет минимальный прямоугольник,
содержащий все объекты группы.
Такой подход особенно полезен для:
Без дополнительных настроек объекты могут располагаться вплотную к краям карты.
Для создания внутренних отступов используются параметры
padding.
map.fitBounds(bounds, {
padding: [50, 50]
});
Также доступны отдельные настройки:
map.fitBounds(bounds, {
paddingTopLeft: [100, 50],
paddingBottomRight: [50, 50]
});
Это особенно актуально при наличии боковых панелей интерфейса.
Например:
map.fitBounds(bounds, {
paddingTopLeft: [300, 20]
});
Левая часть карты будет учитывать панель шириной 300 пикселей.
Leaflet позволяет узнать область, отображаемую пользователю в данный момент.
const bounds = map.getBounds();
После этого становятся доступны координаты углов.
console.log(bounds.getSouthWest());
console.log(bounds.getNorthEast());
Пример результата:
LatLng(55.68, 37.49)
LatLng(55.92, 37.81)
Объект LatLngBounds предоставляет набор методов доступа
к координатам.
bounds.getNorth();
bounds.getSouth();
bounds.getEast();
bounds.getWest();
Пример:
const bounds = map.getBounds();
console.log("Север:", bounds.getNorth());
console.log("Юг:", bounds.getSouth());
console.log("Восток:", bounds.getEast());
console.log("Запад:", bounds.getWest());
Для определения центра прямоугольной области используется метод
getCenter().
const center = bounds.getCenter();
console.log(center);
Результат:
LatLng(55.80, 37.65)
Полученное значение может использоваться для:
Метод contains() определяет, находится ли координата
внутри области.
const bounds = map.getBounds();
const point = L.latLng(55.75, 37.61);
console.log(bounds.contains(point));
Результат:
true
Если координата выходит за пределы прямоугольника:
false
Подобная проверка часто применяется при фильтрации объектов на карте.
Метод intersects() позволяет определить пересечение двух
прямоугольных областей.
const bounds1 = L.latLngBounds(
[55.70, 37.50],
[55.90, 37.80]
);
const bounds2 = L.latLngBounds(
[55.80, 37.70],
[56.00, 38.00]
);
console.log(bounds1.intersects(bounds2));
Результат:
true
Метод широко используется в картографических сервисах для определения видимости данных.
Границы можно динамически увеличивать.
Для этого используется метод extend().
const bounds = L.latLngBounds(
[55.70, 37.50],
[55.90, 37.80]
);
bounds.extend([56.00, 38.10]);
После выполнения область автоматически пересчитается и включит новую точку.
Расширение удобно использовать при последовательном добавлении объектов:
const bounds = L.latLngBounds();
markers.forEach(marker => {
bounds.extend(marker.getLatLng());
});
Затем:
map.fitBounds(bounds);
Leaflet позволяет запретить пользователю покидать определённую территорию.
Для этого используется параметр maxBounds.
const bounds = [
[55.60, 37.30],
[56.00, 38.00]
];
map.setMaxBounds(bounds);
Теперь перемещение карты будет ограничено указанной областью.
Пользователь сможет:
Для усиления ограничения применяется параметр вязкости границ.
const map = L.map("map", {
maxBounds: [
[55.60, 37.30],
[56.00, 38.00]
],
maxBoundsViscosity: 1.0
});
Значения параметра:
| Значение | Поведение |
|---|---|
| 0.0 | Ограничение практически отсутствует |
| 0.5 | Частичное сопротивление выходу |
| 1.0 | Полный запрет выхода |
При перемещении карты часто требуется выполнять дополнительные действия.
Наиболее распространённое событие:
map.on("moveend", function () {
const bounds = map.getBounds();
console.log(bounds);
});
Событие срабатывает после завершения перемещения карты.
Также используется:
map.on("zoomend", function () {
const bounds = map.getBounds();
console.log(bounds);
});
Оно возникает после изменения масштаба.
Один из важнейших сценариев использования границ — подгрузка данных только для видимой области.
map.on("moveend", function () {
const bounds = map.getBounds();
const north = bounds.getNorth();
const south = bounds.getSouth();
const east = bounds.getEast();
const west = bounds.getWest();
loadObjects({
north,
south,
east,
west
});
});
Сервер получает координаты области и возвращает только необходимые объекты.
Преимущества подхода:
Leaflet может автоматически вычислять границы по набору точек.
const points = [
[55.75, 37.61],
[55.81, 37.72],
[55.68, 37.54],
[55.92, 37.85]
];
const bounds = L.latLngBounds(points);
map.fitBounds(bounds);
Библиотека самостоятельно найдёт:
Метод contains() работает не только с точками, но и с
другими границами.
const cityBounds = map.getBounds();
const districtBounds = L.latLngBounds(
[55.72, 37.55],
[55.78, 37.65]
);
console.log(cityBounds.contains(districtBounds));
Результат:
true
Это позволяет контролировать вложенные территории различного уровня.
При подгонке карты можно использовать плавную анимацию.
map.flyToBounds(bounds);
В отличие от fitBounds(), переход будет сопровождаться
анимированным перемещением и изменением масштаба.
Дополнительные параметры:
map.flyToBounds(bounds, {
duration: 2
});
Значение указывается в секундах.
После добавления GeoJSON-слоя его границы можно вычислить автоматически.
const geojsonLayer = L.geoJSON(data).addTo(map);
const bounds = geojsonLayer.getBounds();
map.fitBounds(bounds);
Метод учитывает все объекты внутри слоя:
Это позволяет отображать данные любого размера без ручного расчёта координат.
const routeLayer = L.geoJSON(routeData);
map.fitBounds(routeLayer.getBounds());
const group = L.featureGroup(offices);
map.fitBounds(group.getBounds());
map.setMaxBounds(countryBounds);
map.on("moveend", updateVisibleObjects);
if (map.getBounds().contains(marker.getLatLng())) {
console.log("Объект видим");
}
Границы карты являются одним из ключевых механизмов Leaflet. Через
LatLngBounds реализуются автоматическое масштабирование,
контроль навигации, пространственные проверки, эффективная загрузка
данных и управление отображением больших наборов географических
объектов. Грамотное использование границ существенно упрощает разработку
интерактивных картографических приложений и повышает их
производительность.