В MapLibre GL JS объект, описывающий прямоугольную географическую
область, используется как фундаментальная абстракция для работы с
картой: вычисление видимой области, фильтрация объектов по экрану,
подгонка камеры, построение тайловых запросов и геопространственных
операций. Ключевой структурой для этих задач выступает
LngLatBounds, представляющий границы в координатах долготы
и широты.
LngLatBounds описывает прямоугольник в географическом
пространстве через две точки: юго-западную и северо-восточную. В
простейшем случае это пара координат:
Такая модель позволяет однозначно задать область на глобусе с учётом особенностей координатной системы WGS84.
Создание экземпляра выполняется через конструктор, принимающий две точки:
const bounds = new maplibregl.LngLatBounds(
[longitudeWest, latitudeSouth],
[longitudeEast, latitudeNorth]
);
Если параметры не переданы, создаётся «пустой» объект границ, который впоследствии можно расширять.
Пустой LngLatBounds не содержит валидной геометрии до
тех пор, пока в него не будут добавлены координаты через
extend. Это важно учитывать при вычислениях центра или
попытках извлечь углы.
Создаёт границы из одной точки. Фактически инициализирует bounds с одинаковыми SW и NE координатами:
const b = maplibregl.LngLatBounds.fromLngLat([30, 50]);
Используется как стартовая точка для последующего расширения.
Принимает объект или массив, совместимый с
LngLatLike:
const b = maplibregl.LngLatBounds.fromLngLatLike({ lng: 30, lat: 50 });
Этот метод удобен при работе с данными из GeoJSON или API.
extend — центральный метод, позволяющий динамически
увеличивать bounding box:
bounds.extend([lng, lat]);
Каждое новое значение сравнивается с текущими границами:
const bounds = new maplibregl.LngLatBounds();
coordinates.forEach(coord => bounds.extend(coord));
Такой подход применяется при вычислении охвата GeoJSON-геометрий.
LngLatBounds предоставляет методы для извлечения ключевых углов прямоугольника.
Возвращает юго-западную точку:
const sw = bounds.getSouthWest();
Возвращает северо-восточную точку:
const ne = bounds.getNorthEast();
Для полноты геометрии доступны также:
getNorthWest()getSouthEast()Эти методы полезны при построении полигонов или кастомной визуализации границ.
Метод вычисляет географический центр bounding box:
const center = bounds.getCenter();
Алгоритм основан на усреднении координат:
Если границы пересекают ±180° долготы, простое усреднение может давать некорректный результат. В таких случаях библиотека учитывает wrap-around логику, если она активирована или поддерживается контекстом карты.
Позволяет определить, содержит ли объект реальные координаты:
if (bounds.isEmpty()) {
// границы ещё не заданы
}
Пустое состояние возникает:
extendВозвращает границы в виде массива:
const arr = bounds.toArray();
Формат:
[
[west, south],
[east, north]
]
Это удобно для сериализации и передачи данных между системами.
Возвращает человекочитаемое описание:
console.log(bounds.toString());
Используется в основном для отладки. Формат не предназначен для парсинга.
Хотя основная функциональность LngLatBounds — описание области, он также поддерживает пространственные проверки.
В типичном использовании проверка принадлежности точки реализуется через сравнение с границами:
Это используется для:
LngLatBounds активно используется в связке с камерой
(Map), особенно через метод fitBounds.
map.fitBounds(bounds, {
padding: 20
});
LngLatBounds часто строится из GeoJSON-данных:
const bounds = new maplibregl.LngLatBounds();
geojson.features.forEach(feature => {
feature.geometry.coordinates.forEach(coord => {
bounds.extend(coord);
});
});
Для сложных геометрий (Polygon, MultiPolygon) требуется рекурсивный обход координат.
Одна из ключевых сложностей географических bounds — пересечение антимеридиана.
Пример:
Геометрически это узкая область, но численно выглядит как огромный диапазон. LngLatBounds учитывает это через внутренние механизмы нормализации.
Частая проблема:
// ошибка
[newLngLatBounds([lat, lng], [lat, lng])]
// правильно
[newLngLatBounds([lng, lat], [lng, lat])]
Вызов getCenter() на пустом объекте может привести к
некорректным результатам. Перед этим всегда требуется
extend.
GeoJSON может содержать глубоко вложенные массивы координат, и простая итерация не всегда достаточна.
const bounds = new maplibregl.LngLatBounds();
points.forEach(p => bounds.extend(p));
map.fitBounds(bounds);
Использование bounds позволяет ограничить выборку данных только текущей областью экрана.
if (bounds.contains(marker.getLngLat())) {
// объект видим
}
LngLatBounds часто используется как базовый строительный блок для административных и пользовательских зон.
LngLatBounds тесно связан с:
LngLat — точечная координатаMap — визуализация и камераMercatorCoordinate — проекционные расчётыОн выступает промежуточным слоем между сырой геометрией и визуальной системой карты.
Работа с bounds крайне дешёвая вычислительно, так как:
Однако узким местом может стать количество вызовов
extend при обработке больших датасетов. В таких случаях
рекомендуется:
В архитектуре геосервисов LngLatBounds часто выступает как:
Его простота делает его универсальным элементом между клиентской и серверной логикой геоданных.