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

earthdistance — вычисление расстояний между точками на Земле

примечание

Эта страница переведена при помощи нейросети GigaChat.

Модуль earthdistance предоставляет два различных подхода к расчету расстояний по большому кругу на поверхности Земли. Первый из описанных зависит от модуля cube. Второй основан на встроенном типе данных point, используя долготу и широту для координат.

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

Модуль cube должен быть установлен до того, как будет установлен модуль earthdistance (хотя можно использовать опцию CASCADE команды CREATE EXTENSION, чтобы установить оба модуля одной командой).

Предупреждение

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

Земные расстояния по кубам

Данные хранятся в кубах, которые являются точками (оба угла одинаковы), с использованием трех координат, представляющих расстояние по осям x, y и z от центра Земли. Обеспечивается домен earth над типом cube, который включает проверки ограничений, что значение удовлетворяет этим ограничениям и находится достаточно близко к реальной поверхности Земли.

Радиус Земли получается из функции earth(). Он дан в метрах. Но, изменив эту одну функцию, можно изменить модуль для использования других единиц измерения или использовать другое значение радиуса, которое является более подходящим.

Этот пакет также применим к астрономическим базам данных. Астрономы обычно меняют функцию earth(), чтобы она возвращала радиус, равный 180/pi(), и расстояния в результате выдавались в градусах.

Предоставляются функции для поддержки ввода широты и долготы (в градусах), для поддержки вывода широты и долготы, для расчета расстояния по большому кругу между двумя точками и для легкого определения ограничивающего прямоугольника, который можно использовать для индексных поисков.

Предоставленные функции показаны в ниже.

Функции земных расстояний по кубам:

ФункцияОписание
earth () → float8Возвращает предполагаемый радиус Земли
sec_to_gc ( float8 ) → float8Преобразует обычное прямолинейное (секущее) расстояние между двумя точками на поверхности Земли в большое круговое расстояние между ними
gc_to_sec ( float8 ) → float8Преобразует большое круговое расстояние между двумя точками на поверхности Земли в нормальное прямолинейное (секущее) расстояние между ними
ll_to_earth ( float8, float8 ) → earthВозвращает местоположение точки на поверхности Земли по ее широте (аргумент 1) и долготе (аргумент 2) в градусах
latitude ( earth ) → float8Возвращает широту в градусах точки на поверхности Земли
longitude ( earth ) → float8Возвращает долготу в градусах точки на поверхности Земли
earth_distance ( earth, earth ) → float8Возвращает расстояние по большому кругу между двумя точками на поверхности Земли
earth_box ( earth, float8 ) → cubeВозвращает прямоугольник, подходящий для поиска с использованием оператора cube @> для точек, находящихся на заданном расстоянии по большому кругу от определенного местоположения. Некоторые точки в этом прямоугольнике находятся дальше указанного расстояния по большому кругу от местоположения, поэтому во втором запросе следует использовать проверку с помощью earth_distance

Земные расстояния по точкам

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

В модуле реализован один оператор, показанный в таблице ниже.

Операторы земных расстояний по точкам:

ОператорОписание
point <@> pointfloat8Вычисляет расстояние в сухопутных милях между двумя точками на поверхности Земли

Обратите внимание, что в отличие от основанной на cube части модуля, здесь жестко заданы единицы измерения: изменение функции earth() не повлияет на результаты этого оператора.

Один из недостатков представления долготы/широты заключается в том, что нужно быть осторожным с граничными условиями вблизи полюсов и около +/- 180 градусов долготы. Представление, основанное на cube, избегает этих разрывов.