Bounds для растровых источников

В MapLibre GL JS растровые источники (raster sources) представляют собой набор тайлов изображений, которые подгружаются по координатной сетке в соответствии с текущим положением карты и уровнем масштабирования. В отличие от векторных данных, где геометрия интерпретируется на клиенте, растровые источники уже содержат готовое изображение, что делает критически важным контроль области их загрузки.

Параметр bounds в конфигурации источника задаёт географический прямоугольник, внутри которого разрешена подгрузка тайлов. Этот механизм влияет не на отображение уже загруженных данных, а на сам процесс запроса тайлов у сервера.


Параметр bounds в источнике raster

В MapLibre GL JS параметр bounds задаётся в виде массива из четырёх чисел:

bounds: [west, south, east, north]

где:

  • west — западная долгота
  • south — южная широта
  • east — восточная долгота
  • north — северная широта

Все значения задаются в координатах WGS84 (EPSG:4326).

Пример конфигурации растрового источника:

map.addSource('satellite', {
  type: 'raster',
  tiles: [
    'https://example.com/tiles/{z}/{x}/{y}.png'
  ],
  tileSize: 256,
  bounds: [-122.55, 37.68, -122.35, 37.83]
});

В данном случае загрузка тайлов будет ограничена прямоугольником, охватывающим часть территории Сан-Франциско.


Поведение bounds при запросе тайлов

При каждом изменении вида карты MapLibre выполняет пересчёт видимых тайлов. Для растрового источника с заданным bounds выполняется дополнительная проверка:

  1. Вычисляется географическая граница каждого потенциального тайла.
  2. Производится пересечение с заданным прямоугольником bounds.
  3. Тайлы, не пересекающиеся с областью, исключаются из загрузки.

Важно, что bounds не обрезает уже загруженные изображения. Он влияет только на запросы к серверу.


Влияние на систему тайлов

Растровые тайлы в MapLibre основаны на схеме XYZ. При отсутствии ограничения bounds система предполагает, что слой потенциально существует во всём мире, и запрашивает тайлы для любых координат.

При задании bounds:

  • сокращается количество HTTP-запросов
  • уменьшается нагрузка на тайловый сервер
  • ускоряется рендеринг карты за счёт исключения пустых областей
  • уменьшается вероятность появления “пустых квадратов” вне зоны покрытия

Однако важно учитывать, что система не изменяет глобальную проекцию Web Mercator. Даже при ограниченном bounds карта остаётся непрерывной в мировом масштабе.


Сочетание bounds с minzoom и maxzoom

Ограничение области часто используется вместе с параметрами minzoom и maxzoom, которые управляют диапазоном масштабов:

map.addSource('terrain', {
  type: 'raster',
  tiles: ['https://example.com/terrain/{z}/{x}/{y}.png'],
  tileSize: 256,
  bounds: [10.0, 45.0, 12.0, 46.5],
  minzoom: 5,
  maxzoom: 14
});

Связь параметров:

  • bounds ограничивает географическую область
  • minzoom и maxzoom ограничивают детализацию

При сочетании этих параметров достигается более строгий контроль над источником данных: сервер получает запросы только в нужной зоне и на допустимых уровнях детализации.


Поведение при выходе карты за границы bounds

Когда пользователь перемещает карту за пределы заданного прямоугольника:

  • тайлы перестают запрашиваться
  • ранее загруженные изображения могут оставаться на экране, пока не будут вытеснены
  • фон карты становится видимым (если отсутствуют другие слои)

MapLibre не ограничивает саму карту автоматически. Параметр bounds источника не является ограничением камеры. Для ограничения перемещения используется отдельная настройка:

map.setMaxBounds([
  -122.6, 37.6,
  -122.3, 37.9
]);

Таким образом, важно различать:

  • source bounds — ограничение данных
  • map bounds — ограничение камеры

Переполнение мира и повторяемость тайлов

Web Mercator допускает горизонтальное повторение мира (wrap). При использовании растровых слоёв это может приводить к дублированию тайлов.

bounds частично решает эту проблему, предотвращая загрузку тайлов вне заданной области, но не отключает глобальную систему координат.

Если слой строго локальный, рекомендуется также учитывать:

  • отключение wrapX (если используется кастомная реализация)
  • настройку минимального/максимального zoom
  • корректную разметку tile server (без мирового шардинга)

Геометрическая интерпретация bounds

MapLibre интерпретирует bounds как прямоугольник в географических координатах, но сопоставляет его с проекцией Web Mercator.

Это означает:

  • на высоких широтах визуальная площадь искажается
  • прямоугольник bounds на карте может выглядеть несимметрично
  • реальные тайловые границы привязываются к квадратной сетке

При пересечении с тайлами используется проверка перекрытия, а не строгая геометрическая резка.


Использование bounds для локальных слоёв

Растровые слои часто применяются для:

  • ортофотопланов
  • спутниковых снимков локальных регионов
  • исторических карт
  • инженерных подложек

В таких случаях bounds является ключевым параметром, так как:

  • предотвращает выход за пределы проекта
  • снижает объём загружаемых данных
  • обеспечивает предсказуемое поведение слоя

Пример конфигурации для локального ортофото:

map.addSource('ortho', {
  type: 'raster',
  tiles: [
    'https://tiles.server.com/ortho/{z}/{x}/{y}.jpg'
  ],
  tileSize: 256,
  bounds: [76.80, 43.10, 77.10, 43.30],
  minzoom: 12,
  maxzoom: 18
});

Взаимодействие bounds и стилевого слоя

Источник с bounds может использоваться в любом raster-layer:

map.addLayer({
  id: 'ortho-layer',
  type: 'raster',
  source: 'ortho',
  paint: {
    'raster-opacity': 0.85,
    'raster-fade-duration': 200
  }
});

Важно, что слой не знает о bounds напрямую — он получает уже отфильтрованные тайлы от источника.


Типичные ошибки при использовании bounds

1. Несоответствие тайловой схемы и bounds

Если сервер отдаёт тайлы за пределами указанного прямоугольника, MapLibre просто не будет их запрашивать, что может привести к “обрезанию” слоя.


2. Неправильный порядок координат

Частая ошибка:

bounds: [lat, lon, lat, lon]

Правильный порядок всегда:

[west, south, east, north]

3. Ожидание физического обрезания изображения

bounds не выполняет клиппинг изображений. Тайлы полностью рендерятся, если они были запрошены, даже если частично выходят за пределы.


4. Конфликт с maxBounds карты

При одновременном использовании:

  • source.bounds
  • map.setMaxBounds()

может возникнуть ситуация, когда карта не может быть перемещена к зоне, где источник вообще доступен.


Оптимизация загрузки тайлов через bounds

Правильная настройка bounds позволяет существенно оптимизировать работу:

  • уменьшение числа запросов на 30–90% для локальных данных
  • ускорение первого отображения слоя
  • снижение нагрузки на CDN
  • более стабильная работа на мобильных устройствах

Дополнительно эффект усиливается при:

  • использовании minzoom для исключения мелких масштабов
  • агрегации тайлов на сервере
  • кешировании по географическим регионам

Поведение при анимации и переходах

Во время плавных переходов (flyTo, easeTo) MapLibre пересчитывает видимые тайлы. При приближении к границе bounds может наблюдаться:

  • постепенное исчезновение тайлов
  • появление пустых областей до подгрузки соседних источников
  • эффект “обрыва” слоя при отсутствии соседних данных

Это ожидаемое поведение, связанное с тем, что система не запрашивает данные вне заданного диапазона.


Роль bounds в архитектуре тайловых сервисов

На стороне сервера bounds часто дублируется логикой:

  • ограничение генерации тайлов
  • фильтрация запросов CDN
  • сегментация наборов данных

В идеальной архитектуре:

  • клиентский bounds предотвращает лишние запросы
  • серверный bounds гарантирует отсутствие лишних тайлов в ответе

Совпадение этих границ критично для консистентности отображения слоя.


Особенности работы с глобальными датасетами

При использовании глобальных растровых источников bounds обычно не задаётся. Однако в некоторых случаях его применяют для:

  • выделения регионов интереса
  • создания тематических “вырезок” из глобального слоя
  • ограничения платного API по географии

В таких сценариях важно учитывать, что вне bounds слой полностью перестаёт существовать на уровне запросов, а не только визуализации.