Как показывают данные, BBOX рассчитывается на основе нижних левых и верхних правых координат. Вы можете создать BBOX, реплицировав координаты x и y из существующих в отсутствующие углы, то есть из нижнего левого и верхнего правого в верхний левый и нижний правый, например, значение y верхнего левого угла такое же, как у в правом верхнем углу.
Используя PostGIS, вы можете передать эти данные в функцию ST_Envelope
, и она автоматически сгенерирует BBOX.
Чика go BBOX:
SELECT ST_AsText(ST_MakeEnvelope(-89.8743648,40.3781136,-85.3852316,43.3781136,4326));
st_astext
-------------------------------------------------------------------------------------------------------------------------------
POLYGON((-89.8743648 40.3781136,-89.8743648 43.3781136,-85.3852316 43.3781136,-85.3852316 40.3781136,-89.8743648 40.3781136))
(1 Zeile)
![enter image description here](https://i.stack.imgur.com/fiK3i.png)
Если вы реверс-инженер этот многоугольник с Функция ST_Extent
вы получите те же пары координат, которые вы указали для ее генерации:
SELECT ST_Extent('POLYGON((-89.8743648 40.3781136,-89.8743648 43.3781136,-85.3852316 43.3781136,-85.3852316 40.3781136,-89.8743648 40.3781136))')
st_extent
----------------------------------------------------
BOX(-89.8743648 40.3781136,-85.3852316 43.3781136)
(1 Zeile)
Создание BBOX на основе точки
Простой подход к создать BBOX вокруг точки - нарисовать буфер с ST_Buffer
и использовать его в качестве параметра с функцией ST_Envelope
, например, POINT(-87.6297982 41.8781136)
- Chica go, IL.
SELECT
ST_AsText(
ST_Envelope(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326),1)));
st_astext
-------------------------------------------------------------------------------------------------------------------------------
POLYGON((-88.6297982 40.8781136,-88.6297982 42.8781136,-86.6297982 42.8781136,-86.6297982 40.8781136,-88.6297982 40.8781136))
(1 Zeile)
![enter image description here](https://i.stack.imgur.com/F5sup.png)
Если вам интересно, почему BBOX не имеет одинаковый размер во всех измерениях: расчеты с использованием GEOMETRY
и GEOGRAPHY
сделаны по-другому, как и их результаты. GEOGRAPHY
вычисляет координаты по сферической поверхности (которая может быть намного медленнее, чем GEOMETRY
) и использует метры в качестве единицы измерения, а GEOGRAPHY
использует плоскую проекцию и использует единицу SRS.
Создать BBOX 100 миль (160,934 км) вокруг точки:
SELECT
ST_AsText(
ST_Envelope(
ST_Rotate(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326)::GEOGRAPHY,160934)::GEOMETRY,0)));
st_astext
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((-89.5681600538661 40.4285062983098,-89.5681600538661 43.327349928921,-85.6903925527536 43.327349928921,-85.6903925527536 40.4285062983098,-89.5681600538661 40.4285062983098))
(1 Zeile)
![enter image description here](https://i.stack.imgur.com/Zif3d.png)
Извлечение только нижнего левого и верхнего правого углов
Если вас интересуют только нижний левый и верхний правый углы вашего BBOX, просто используйте ST_Extent, как описано выше.
SELECT
ST_Extent(
ST_Envelope(
ST_Rotate(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326)::GEOGRAPHY,160934)::GEOMETRY,0)));
st_extent
---------------------------------------------------------------------------
BOX(-89.5681600538661 40.4285062983098,-85.6903925527536 43.327349928921)
(1 Zeile)
Дальнейшее чтение: