Метод fitBounds в MapLibre GL JS используется для
автоматического масштабирования и центрирования карты таким образом,
чтобы заданная географическая область полностью помещалась в видимую
часть экрана. Это один из ключевых инструментов работы с геоданными,
особенно при отображении результатов поиска, геометрий GeoJSON,
маршрутов и административных границ.
Метод принимает границы в формате bounding box:
map.fitBounds([
[minLng, minLat],
[maxLng, maxLat]
]);
Где:
minLng — минимальная долгота (западная граница)minLat — минимальная широта (южная граница)maxLng — максимальная долгота (восточная граница)maxLat — максимальная широта (северная граница)Карте автоматически вычисляет:
map.fitBounds([
[30.1, 59.8],
[30.6, 60.1]
]);
В этом случае карта подберёт такой масштаб, чтобы прямоугольная область полностью оказалась в пределах экрана.
Метод fitBounds поддерживает объект опций, который
позволяет тонко управлять поведением анимации и отображения.
Позволяет создать визуальный зазор между границами карты и краем viewport.
map.fitBounds(bounds, {
padding: 40
});
Также можно задавать асимметричные отступы:
map.fitBounds(bounds, {
padding: {
top: 80,
bottom: 40,
left: 60,
right: 60
}
});
Это особенно важно при наличии UI-элементов (панели, сайдбары, попапы).
Иногда область слишком мала, и карта может чрезмерно приблизиться. Для контроля используется:
map.fitBounds(bounds, {
maxZoom: 12
});
Это гарантирует, что масштаб не превысит заданное значение.
map.fitBounds(bounds, {
duration: 2000
});
Параметр задаётся в миллисекундах и определяет плавность перехода.
map.fitBounds(bounds, {
linear: true
});
true — линейное движение камерыfalse — плавная easing-анимация (по умолчанию)Линейный режим полезен для синхронизации с внешними анимациями или таймлайнами.
map.fitBounds(bounds, {
easing: (t) => t * (2 - t)
});
Функция принимает значение t от 0 до 1 и возвращает
модифицированную кривую анимации.
Позволяет сдвинуть центрирование относительно геометрического центра bounds:
map.fitBounds(bounds, {
offset: [100, -50]
});
Используется при наличии фиксированных панелей интерфейса или всплывающих карточек.
map.fitBounds(bounds, {
essential: true
});
Используется для обозначения критически важной анимации, которая не должна быть отключена системными настройками уменьшения движения (reduced motion).
Часто fitBounds применяется совместно с геометриями
GeoJSON.
Пример вычисления границ вручную:
const coordinates = geojson.features[0].geometry.coordinates;
let minLng = Infinity;
let minLat = Infinity;
let maxLng = -Infinity;
let maxLat = -Infinity;
coordinates.forEach(coord => {
const [lng, lat] = coord;
if (lng < minLng) minLng = lng;
if (lat < minLat) minLat = lat;
if (lng > maxLng) maxLng = lng;
if (lat > maxLat) maxLat = lat;
});
map.fitBounds([
[minLng, minLat],
[maxLng, maxLat]
]);
При работе с LineString (маршрутами) bounds вычисляется по всем точкам линии:
const route = [
[30.1, 59.9],
[30.3, 60.0],
[30.6, 60.05]
];
map.fitBounds([
[
Math.min(...route.map(p => p[0])),
Math.min(...route.map(p => p[1]))
],
[
Math.max(...route.map(p => p[0])),
Math.max(...route.map(p => p[1]))
]
]);
Если bounding box пересекает анти-меридиан, стандартные вычисления могут давать некорректное отображение.
Пример проблемной ситуации:
[
[179, -10],
[-179, 10]
]
В таких случаях необходимо нормализовать долготы или использовать специализированные библиотеки геообработки, чтобы избежать «разрыва» карты.
Метод fitBounds фактически является надстройкой над
анимацией камеры. Он автоматически рассчитывает параметры для
перехода.
Альтернатива:
map.flyTo({
center: [30.3, 60.0],
zoom: 10
});
Разница:
fitBounds — автоматический расчёт по геометрииflyTo — ручное управление камеройИногда требуется мгновенное изменение вида:
map.fitBounds(bounds, {
duration: 0
});
Это полезно при инициализации карты или переключении слоёв без визуального перехода.
После геокодинга список объектов часто агрегируется в один bounding box:
Карта автоматически подстраивается под их расположение.
При работе с кластеризацией точек:
fitBoundsВ навигационных интерфейсах маршрут всегда должен полностью помещаться в экран:
fitBounds учитывает:
При изменении размеров окна может потребоваться повторный вызов метода, чтобы сохранить корректное отображение области.
Ошибка:
[[lat, lng], [lat, lng]]
Правильно:
[[lng, lat], [lng, lat]]
Без padding важные объекты могут оказаться скрыты под интерфейсными элементами.
Область может не приблизиться достаточно, и детали будут неразличимы.
При пустом массиве координат fitBounds вызывает ошибки
или некорректное поведение, поэтому требуется проверка данных перед
вызовом.
В сложных интерфейсах параметр bounds часто вычисляется динамически:
Пример:
if (features.length > 0) {
const bounds = getBounds(features);
map.fitBounds(bounds, { padding: 50 });
}
Повторный вызов fitBounds прерывает текущую анимацию
камеры и запускает новую. Это важно учитывать при:
При необходимости можно дебаунсить вызовы для стабилизации поведения карты.