Перейти к основному содержимому

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 <@> pointfloat8Вычисляет расстояние в сухопутных милях между точками на поверхности Земли

Изменение функции 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.