earthdistance. Вычисление расстояния между точками на поверхности Земли#

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: cube.

Схема размещения: ext.

Модуль реализует два разных варианта вычисления ортодромии:

  • первый вариант зависит от модуля cube;

  • второй вариант основан на встроенном типе данных point, в котором в качестве координат задаются широта и долгота.

Примечание:

Ортодромия – расстояние между точками на поверхности Земли, кратчайшее расстояние между двумя точками на поверхности земного шара, наименьший из отрезков дуги большого круга, проходящей через эти точки.

В этом модуле планета Земля считается идеальной сферой.

В модуле реализованы функции земных расстояний по кубам:

  • для ввода данных, выражающих широту и долготу в градусах;

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

Предоставляемые функции:

Функция

Результат

Описание

earth ()

float8

Возвращает предполагаемый радиус Земли в метрах

sec_to_gc (float8)

float8

Переводит расстояние по обычной прямой (по секущей) между двумя точками на поверхности Земли в расстояние между ними по сфере

gc_to_sec (float8)

float8

Переводит расстояние по сфере между двумя точками на поверхности Земли в расстояние по обычной прямой (по секущей) между ними

ll_to_earth (float8, float8)

earth

Возвращает положение точки на поверхности Земли по заданной широте (первый аргумент) и долготе (второй аргумент) в градусах

latitude (earth)

float8

Возвращает широту точки на поверхности Земли в градусах

longitude (earth)

float8

Возвращает долготу точки на поверхности Земли в градусах

earth_distance (earth, earth)

float8

Возвращает расстояние по сфере между двумя точками на поверхности Земли

earth_box (earth, float8)

cube

Выдает охватывающий куб, подходящий для поиска по индексу с применением реализованного для типа cube оператора @> для точек в пределах заданной ортодромии от цели. Некоторые точки в этом кубе будут отстоять от цели дальше, чем на заданную ортодромию, поэтому в запрос нужно включить вторую проверку с функцией earth_distance.

В модуле реализованы операторы земных расстояний по точкам.

Эта часть модуля основана на представлении точек на Земле в виде значений типа point, в которых первый компонент представляет долготу в градусах, а второй — широту. Точки воспринимаются как (долгота, широта), а не наоборот, так как долгота ближе к интуитивному представлению как оси X, а широта — оси Y.

В модуле реализован один оператор:

Оператор

Результат

Описание

point <@> point

float8

Вычисляет расстояние в сухопутных милях между точками на поверхности Земли

Изменение функции earth() не повлияет на результат этого оператора.

Доработка#

Доработка не проводилась.

Ограничения#

Ограничения отсутствуют.

Установка#

При наличии прав администратора СУБД включение модуля возможно выполнить вручную:

CREATE EXTENSION earthdistance CASCADE SCHEMA ext;

Примечание:

Модуль earthdistance зависит от модуля cube, поэтому сначала необходимо установить модуль cube, либо воспользоваться указанием CASCADE команды CREATE EXTENSION, чтобы установить сразу оба расширения.

Расширения earthdistance и cube настоятельно рекомендуется устанавливать в одну схему. В этой схеме недоверенные пользователи не должны иметь право CREATE. Если в схеме окажутся объекты, созданные злонамеренным пользователем, возможна угроза безопасности.

При использовании функции earthdistance следует ограничивать путь поиска только доверенными схемами.

Настройка#

Настройка не требуется.

Использование модуля#

Функция earth_distance расчета расстояния между двумя точками земли, с функцией ll_to_earth определением координат при помощи широты и долготы:

SELECT earth_distance(ll_to_earth(39.9042, 116.4074), ll_to_earth(31.2304, 121.4737)) AS distance_meters;

Пример вывода:

 distance_meters     
-----------------
        1067260
(1 row)

Ссылки на документацию разработчика#

Дополнительно поставляемый модуль earthdistance: https://www.postgresql.org/docs/15/earthdistance.html.