Ограничивающий прямоугольник (bounding box, bbox) это самая простая и самая полезная пространственная конструкция в любом картографическом стеке. Это четыре числа, которые задают прямоугольник в координатах широты и долготы, и они встречаются почти в каждом вызове API, файле GeoJSON и картографической библиотеке, с которыми вам придётся работать.
В этой статье мы разберём, что такое bbox, какие форматы его записи нужно знать, где он незаменим в рабочих системах и на каких ошибках хотя бы раз спотыкается каждый разработчик.
Определение
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: объект LatLngBounds с углами _southWest и _northEast, сначала широта, потом долгота. Mapbox GL и MapLibre используют LngLatBounds, где первой идёт долгота.
Многие старые API и выгрузки в CSV: [south, west, north, east] (сначала широта). Читайте спецификацию.
Тайловые сервисы и WMS: bbox в единицах проекции (в метрах Web Mercator, а не в широте и долготе), если тайл в EPSG:3857.
Простое правило защиты: не храните в своём коде голый массив из четырёх элементов. Оборачивайте его в типизированный объект с именованными полями ({ west, south, east, north }), чтобы порядок был явным. Преобразуйте формат на границе с внешним API.
Где bbox действительно нужен
Bbox это самый быстрый пространственный фильтр. Вот три классических применения.
Вписать карту в объект. Когда пользователь открывает результат поиска, вы вызываете map.fitBounds(bbox), и карта сама подбирает масштаб и центр, чтобы показать объект с отступами. Такая функция есть в любой современной картографической библиотеке.
Фильтровать запросы к API по области. Базы данных и поисковые API очень эффективно индексируют bbox. Запрос «покажи все места в этой области просмотра» отправляет на сервер видимый bbox, а сервер по пространственному индексу возвращает только подходящие записи. На этом построен поиск по видимой области карты.
Смещать автодополнение и геокодирование. Передайте текущий bbox карты пользователя как смещение к области просмотра. Геокодер даёт больший вес результатам внутри bbox, поэтому на карте Нью-Йорка по запросу «Liberty» первой будет статуя Свободы, а не какое-нибудь другое место с этим названием.
Есть и четвёртое, менее очевидное применение: bbox это единица учёта в системе векторных тайлов. Каждый тайл покрывает известный bbox на известном уровне масштаба, и рендерер собирает из тайлов видимую карту.
Что возвращает API
Большинство API геокодирования возвращают bbox для каждого найденного объекта. По нему видно и размер объекта (bbox страны огромный, bbox здания крошечный), и то, как вписать в него карту. Ответ на запрос «Франция» содержит bbox размером со страну, а ответ на «10 Downing Street» bbox размером со здание.
По размеру bbox удобно проверять точность. Если запрос совпал на уровне страны, а bbox размером со здание, это подозрительно. Если запрос совпал с точностью до здания («rooftop»), а bbox размером с город, что-то сломалось.
Bbox, который пересекает антимеридиан
Коварный случай: bbox, который пересекает антимеридиан на 180 градусах (например, для России, Тихого океана или Фиджи), нельзя записать с условием west < east, потому что он переходит через край карты. Правила здесь разные:
- Некоторые системы делят такой bbox на две части, по одной с каждой стороны антимеридиана.
- Некоторые системы допускают
west > eastи понимают это как переход через край. - GeoJSON (RFC 7946) разрешает такую запись, где west больше east, а геометрии, которые пересекают антимеридиан, рекомендует разрезать на две части.
В большинстве европейских задач и задач в пределах одной страны это не встречается. Если вы делаете глобальный продукт (авиамаршруты, морские перевозки, рыболовство), отдельно проверьте случай с антимеридианом.
Bbox и полигоны
Bbox это прямоугольник, а реальные объекты прямоугольными бывают редко. В bbox Франции попадают часть Атлантического океана и часть Испании. В bbox Манхэттена попадают части Нью-Джерси и Куинса.
Когда приближения прямоугольником достаточно (вписать карту, быстро отсеять лишнее), bbox подходит идеально. Когда нужно знать, лежит ли точка действительно внутри объекта, нужна проверка «точка в полигоне» по реальной границе. Частый приём в рабочих системах: сначала отфильтровать по bbox (быстро, по индексу, отсекает большую часть записей), а потом проверить оставшиеся точки на попадание в полигон (медленно, но точно). Так внутри устроено большинство пространственных баз данных.
Bounding box в компьютерном зрении
В распознавании объектов, робототехнике и 3D-рендеринге встречается термин «ориентированный bounding box». Это другое понятие: OBB повёрнут так, чтобы облегать объект плотнее, чем прямоугольник, выровненный по осям. В геопространственных задачах стандартом остаются прямоугольники вдоль осей: их легко индексировать, они ложатся на сетку тайлов, а проверить их на пересечение элементарно. Ориентированные прямоугольники нужны там, где приходится считать повёрнутые прямоугольники. В картографии это редкость, а в компьютерном зрении обычное дело.
Как MapAtlas использует bbox
Каждый результат Geocoding API и Search API содержит поле bbox с границами найденного объекта в WGS84 в порядке «долгота, широта», то есть именно в том формате, который ждут GeoJSON и современные картографические библиотеки. Параметр boundary.rect.* смещает геокодирование к области просмотра, а Isochrone API возвращает полигоны времени в пути вместе с bbox, чтобы вы могли вписать карту без собственных расчётов.
Чтобы разобраться в GeoJSON и в том, какое место bbox занимает среди пространственных данных, прочитайте статьи Что такое GeoJSON и Что такое геокод.
Часто задаваемые вопросы
Что такое bounding box?
Bounding box, или ограничивающий прямоугольник (часто сокращают до bbox), это наименьший прямоугольник со сторонами вдоль осей координат, в который помещается географический объект или набор точек. Его задают четыре числа: минимальная и максимальная долгота, минимальная и максимальная широта. В картографии bbox нужен повсюду: чтобы вписать карту в объект, отфильтровать запросы к базе данных по области, задать границы тайла и сместить результаты геокодирования к нужному региону. Это самая простая и самая быстрая пространственная конструкция в рабочем коде.
Какой формат bounding box считается стандартным?
GeoJSON и большинство современных API используют порядок [west, south, east, north], то есть [minLng, minLat, maxLng, maxLat]. Берите его по умолчанию. Некоторые старые API и выгрузки в CSV используют [south, west, north, east] (сначала широта), а в отдельных форматах это четыре отдельных поля. Всегда проверяйте документацию конкретного API или формата. Самая частая ошибка: перепутать порядок широты и долготы, и тогда прямоугольник оказывается на другой стороне планеты.
Чем bounding box отличается от ориентированного bounding box?
Обычный bbox выровнен по осям: его стороны идут вдоль линий широты и долготы. Ориентированный прямоугольник (OBB, его часто используют в компьютерном зрении и игровых движках) повёрнут так, чтобы плотнее облегать объект. Площадь у него меньше, но математика сложнее. В геопространственных задачах стандартом остаются прямоугольники, выровненные по осям: их легко индексировать в пространственных базах данных, они ложатся на сетку тайлов, а проверить их на пересечение элементарно. Ориентированные прямоугольники встречаются в 3D-рендеринге, распознавании объектов и физических движках.
Как отфильтровать результаты API геокодирования с помощью bounding box?
Передайте bbox как параметр смещения к области просмотра. В MapAtlas Geocoding API для этого есть параметры `boundary.rect.min_lon`, `boundary.rect.min_lat`, `boundary.rect.max_lon`, `boundary.rect.max_lat`, и геокодер ставит результаты внутри этой области выше, чем результаты за её пределами. Для автодополнения на карте это очень важно: когда пользователь двигает карту, вы обновляете bbox, и подсказки соответствуют тому, что он видит. Без смещения по bbox автодополнение для «Springfield» вернёт самый популярный Springfield в мире, а пользователю почти никогда нужен не он.

