Bounding box — простейший и наиболее полезный пространственный примитив в любом картографическом стеке. Четыре числа, описывающие прямоугольник в пространстве широты и долготы, встречаются практически в каждом API-вызове, GeoJSON-файле и библиотеке карт, с которыми вам приходится работать.
Это руководство объясняет, что такое bounding box, какие соглашения о форматах нужно знать, где он незаменим в продакшне и какие подводные камни подстерегают каждого разработчика хотя бы раз.
Определение
Bounding box (bbox) — наименьший выровненный по осям прямоугольник, содержащий объект или набор точек. «Выровненный по осям» означает, что его стороны идут вдоль осей широты и долготы; прямоугольник не повёрнут. Bbox описывается четырьмя числами: западная долгота, южная широта, восточная долгота и северная широта.
Официальный bbox Парижа примерно равен [2.224, 48.8156, 2.4699, 48.9022]. Для континентальной Франции — примерно [-5.142, 41.333, 9.560, 51.089]. Для всей планеты — [-180, -90, 180, 90].
Bbox всегда определяется двумя противоположными углами. Он не может описать непрямоугольную форму, но может описать прямоугольник, оборачивающий любую форму, чего достаточно для быстрой пространственной фильтрации.
Вопрос формата
Соглашения о форматах bbox не единообразны в разных системах, и именно эта несогласованность является источником большинства связанных с bbox багов.
GeoJSON, стандарты OGC и большинство современных API: [west, south, east, north], эквивалентно [minLng, minLat, maxLng, maxLat]. Сначала долгота, потом широта, оба в WGS84.
Некоторые библиотеки веб-карт (объекты Leaflet, Mapbox GL bounds): объект LatLngBounds с углами _southWest и _northEast. Сначала широта, потом долгота.
Многие устаревшие API и CSV-экспорты: [south, west, north, east] (широта первой). Читайте спецификацию.
Тайловые сервисы и WMS: bbox в единицах проекции (метры Web Mercator, а не широта/долгота), если тайл в EPSG:3857.
Защитное правило: никогда не используйте голый 4-элементный массив в своём коде. Оборачивайте его в типизированный объект с именованными полями ({ west, south, east, north }), чтобы порядок был явным. Выполняйте преобразование на границах API.
Где bounding box действительно нужен
Bbox — быстрейший возможный пространственный фильтр. Три классических применения:
Подгонка карты к объекту. Когда пользователь переходит к результату поиска, вызывается map.fitBounds(bbox) и карта масштабируется и центрируется на объекте с соответствующими отступами. Этот примитив есть в каждой современной библиотеке карт.
Фильтрация API-запросов по площади. Движки баз данных и поисковые API очень эффективно индексируют bbox. Запрос «покажи мне все объекты в этом viewport» отправляет видимый bbox на сервер, который использует пространственный индекс для возврата только совпадающих записей. Это основа поиска по viewport.
Смещение автодополнения и геокодирования. Передайте текущий bbox карты пользователя как смещение viewport. Геокодер взвешивает результаты внутри bbox выше, поэтому при вводе «Liberty» внутри карты Нью-Йорка пользователь получает Статую Свободы прежде любой другой Либерти в мире.
Четвёртое, менее очевидное применение: bbox — единица учёта в системе векторных тайлов. Каждый тайл охватывает известный bbox на известном уровне зума, и рендерер составляет их в видимую карту.
Что возвращает API
Большинство геокодирующих API возвращают bbox вместе с каждым совпадением, потому что он указывает и на размер найденного объекта (bbox страны огромен, bbox здания крошечен), и на то, как масштабировать карту. Геокодирующий ответ для «Франции» возвращает bbox национального масштаба; ответ для «10 Downing Street» — bbox масштаба здания.
Размер возвращённого bbox можно использовать как проверку точности. Запрос, совпавший на уровне «страны», но возвращающий bbox размером со здание, вызывает подозрения. Запрос, совпавший с точностью «до крыши», но возвращающий bbox размером с город, явно сломан.
Bounding box, пересекающий антимеридиан
Тонкая ловушка: bbox, пересекающий 180-градусный антимеридиан (например, для России, Тихого океана, Фиджи), не может быть описан как west < east, потому что он огибает землю. Соглашения различаются:
- Некоторые системы разбивают такой bbox на две части, по одной для каждой стороны антимеридиана.
- Некоторые системы допускают
west > eastи интерпретируют это как «огибать по кругу». - GeoJSON допускает оборачивание, но для совместимости рекомендует разбиение.
Для большинства европейских сценариев или сценариев с одной страной это никогда не встречается. Если вы строите глобальный продукт (авиамаршруты, судоходство, рыболовство) — явно тестируйте случай с антимеридианом.
Bounding box и полигоны
Bbox — прямоугольник. Реальный объект редко является прямоугольником. Bbox Франции включает части Атлантического океана и Испании. Bbox Манхэттена включает части Нью-Джерси и Куинса.
Когда прямоугольное приближение достаточно хорошо (подгонка карты, быстрая предварительная фильтрация), bbox — правильный инструмент. Когда нужно знать, находится ли точка действительно внутри объекта, требуется математика point-in-polygon по реальной граничной геометрии. Распространённый продакшн-паттерн: сначала фильтрация по bbox (быстро, индексируемо, отсеивает 99% записей), затем point-in-polygon для оставшихся (медленно, но точно). Именно так большинство пространственных баз данных работают под капотом.
Bounding box в компьютерном зрении
В обнаружении объектов, робототехнике или 3D-рендеринге можно встретить термин «ориентированный bounding box». Это другая концепция: OBB повёрнут, чтобы облегать объект плотнее, чем выровненный по осям прямоугольник. В геопространственной работе стандартом являются выровненные по осям bbox, потому что они чисто индексируются, вписываются в тайловую сетку и тривиально проверяются на перекрытие. Ориентированные bbox нужны, когда требуется математика с повёрнутыми прямоугольниками — это редкость в картографии, но распространено в компьютерном зрении.
Как MapAtlas использует bounding box
Каждый результат Geocoding API и Search API возвращает поле bbox с охватом найденного объекта в формате WGS84 долгота/широта — именно том, который ожидают GeoJSON и современные библиотеки карт. Параметр boundary.rect.* позволяет сместить геокодирование к viewport, а Isochrone API возвращает полигоны времени в пути с оборачивающим bbox, чтобы вы могли подогнать карту без самостоятельных вычислений.
Практическое введение в GeoJSON и место bbox в более широкой картине пространственных данных: Что такое GeoJSON и Что такое геокод.
Часто задаваемые вопросы
Что такое bounding box?
Bounding box (часто сокращённо bbox) — наименьший выровненный по осям прямоугольник, содержащий географический объект или набор точек. Описывается четырьмя числами: минимальная и максимальная долгота, минимальная и максимальная широта. Bounding box используется повсюду в картографии: для подгонки карты к объекту, для фильтрации запросов к базе данных по площади, для определения охвата тайла и для смещения результатов геокодирования в область. Это простейший и самый быстрый пространственный примитив в продакшн-коде.
Каков стандартный формат bounding box?
GeoJSON и большинство современных API используют порядок [west, south, east, north], также записываемый как [minLng, minLat, maxLng, maxLat]. Это формат, который следует считать стандартным. Некоторые устаревшие API и CSV-экспорты используют [south, west, north, east] (широта первой), а в ряде форматов применяются четыре отдельных поля. Всегда проверяйте документацию конкретного API или формата. Наиболее распространённая ошибка — перепутать порядок широты и долготы, отчего прямоугольник оказывается с противоположной стороны планеты.
В чём разница между bounding box и ориентированным bounding box?
Обычный bounding box выровнен по осям: его стороны идут вдоль осей широты и долготы. Ориентированный bounding box (OBB, распространённый в компьютерном зрении и игровых движках) повёрнут, чтобы плотнее облегать объект, что даёт меньшую площадь, но более сложную математику. В геопространственной работе стандартом являются выровненные по осям bbox, потому что они чисто индексируются в пространственных базах данных, вписываются в тайловую сетку и тривиально проверяются на перекрытие. Ориентированные bounding box используются в 3D-рендеринге, обнаружении объектов и физических движках.
Как использовать bounding box для фильтрации геокодирующего API?
Передайте bbox как параметр смещения viewport. В MapAtlas Geocoding API для этого используются `boundary.rect.min_lon`, `boundary.rect.min_lat`, `boundary.rect.max_lon`, `boundary.rect.max_lat`, и геокодер ранжирует результаты внутри этой области выше, чем результаты за её пределами. Это принципиально важно для автодополнения внутри карты: по мере того как пользователь панирует, вы обновляете bbox, чтобы подсказки соответствовали тому, что он видит. Без смещения по bbox автодополнение «Springfield» вернёт тот Springfield, у которого наибольшая глобальная популярность, что почти никогда не то, что нужно пользователю.

