Работа с картой в геоинформационных интерфейсах неизбежно связана с понятием ограниченной области отображения. В контексте MapLibre GL JS эта область представляется объектом границ (bounds), который описывает прямоугольник на поверхности Земли в координатах долготы и широты. Границы используются для позиционирования камеры, ограничения перемещения карты, вычисления видимой области и анализа геоданных.
Bounds в MapLibre GL JS опираются на географическую систему координат WGS84:
Границы всегда задаются парой углов:
Стандартная структура:
[[west, south], [east, north]]
где:
west — минимальная долготаsouth — минимальная широтаeast — максимальная долготаnorth — максимальная широтаНаиболее распространённый формат — вложенный массив:
const bounds = [
[37.62, 55.73], // south-west (lng, lat)
[37.70, 55.80] // north-east (lng, lat)
];
Этот формат используется при передаче параметров в методы камеры и утилиты карты.
Внутренний тип bounds в MapLibre GL JS представлен классом
LngLatBounds, который инкапсулирует логику работы с
прямоугольной географической областью.
Создание:
const bounds = new maplibregl.LngLatBounds(
[37.62, 55.73],
[37.70, 55.80]
);
Особенности:
В геопространственных форматах bounds часто представляются как bbox:
[west, south, east, north]
Пример:
const bbox = [37.62, 55.73, 37.70, 55.80];
Этот формат используется в GeoJSON-спецификациях и часто
конвертируется в LngLatBounds.
Полностью переопределяет границы:
bounds.set(
[10, 10],
[20, 20]
);
Используется при полной замене области.
Расширяет текущие границы, включая новую точку или другой bounds:
bounds.extend([30, 40]);
bounds.extend(otherBounds);
Поведение:
Возвращают угловые точки:
const ne = bounds.getNorthEast();
const sw = bounds.getSouthWest();
Результат — объекты LngLat с методами lng()
и lat().
Возвращает массивный формат:
bounds.toArray();
Результат:
[[west, south], [east, north]]
Одна из ключевых операций — автоматическое масштабирование карты под заданные границы:
map.fitBounds(bounds, {
padding: 20,
duration: 1000
});
Параметры:
padding — отступ от краёв экранаduration — длительность анимацииmaxZoom — ограничение приближенияАлгоритм:
Ограничивает перемещение карты:
map.setMaxBounds(bounds);
Поведение:
Bounds автоматически приводятся к корректному диапазону:
[-90, 90][-180, 180]Пример нормализации:
new maplibregl.LngLatBounds(
[200, 100],
[400, 200]
);
Результат будет приведён к допустимым значениям.
Особый случай — пересечение 180° долготы.
Пример:
west = 170
east = -170
Это означает, что область пересекает линию смены дат.
Поведение:
Bounds поддерживает проверку принадлежности:
bounds.contains([lng, lat]);
Возвращает:
true — точка внутриfalse — вне областиЛогика учитывает:
Создание без параметров:
const bounds = new maplibregl.LngLatBounds();
Состояние:
extend() инициализирует областьТипичное применение:
const b = new maplibregl.LngLatBounds();
data.forEach(p => b.extend(p));
bounds.extend(otherBounds);
Результат:
const b = new maplibregl.LngLatBounds();
points.forEach(p => b.extend(p));
Используется для:
При большом количестве операций важно учитывать:
extend() дешевле пересоздания boundsПаттерн:
const b = new maplibregl.LngLatBounds();
for (const feature of features) {
b.extend(feature.geometry.coordinates);
}
map.fitBounds(b);
Неверно:
[lat, lng]
Правильно:
[lng, lat]
Если west > east или south > north без учёта wrap-around, bounds становится некорректным.
Обычное сравнение чисел ломает логику глобальных bounds.
Bounds в геокоординатах часто конвертируются в pixel-space через:
Это используется внутри:
fitBoundsBounds выступают связующим звеном между:
Типичные сценарии: