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

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.