Вычисление ограничительной рамки из пар широты и долготы - PullRequest
0 голосов
/ 18 января 2020

Google возвращает текущие значения широты и долготы, но рассчитываются левый нижний лат и долгота и верхний правый лат и долг. Я не смог выяснить, как он рассчитывается.

Кто-нибудь знает, если это расстояние * stati c? разница в процентах? Как рассчитывается?

Чика go, ИЛ

current lat 41.8781136
current lon -87.6297982 
lower left lat  40.3781136
lower left lon  -89.8743648   
upper right lat 43.3781136
upper right lon -85.3852316

Нью-Йорк

current lat 40.7127753
current lon -74.0059728
lower left lat  39.2127753
lower left lon  -76.26396172
upper right lat 42.2127753
upper right lon -71.74798388

ОБНОВЛЕНИЕ :

Зная, что он 103,5 миль от центра к левой стороне и правой стороне, и зная его 103,5 миль от центра к верхнему и нижнему основаниям dry.

Используя текущую точку широты и долготы, как рассчитать нижнюю левую и верхнюю правую точки?

Я полагаю, у PostGIS есть функция для этого?

1 Ответ

3 голосов
/ 18 января 2020

Как показывают данные, 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

Если вы реверс-инженер этот многоугольник с Функция 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

Если вам интересно, почему 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

Извлечение только нижнего левого и верхнего правого углов

Если вас интересуют только нижний левый и верхний правый углы вашего 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)

Дальнейшее чтение:

...