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 <@> point → float8 | Вычисляет расстояние в сухопутных милях между двумя точками на поверхности Земли |
Обратите внимание, что в отличие от основанной на cube
части модуля, здесь жестко заданы единицы измерения: изменение функции earth()
не повлияет на результаты этого оператора.
Один из недостатков представления долготы/широты заключается в том, что нужно быть осторожным с граничными условиями вблизи полюсов и около +/- 180 градусов долготы. Представление, основанное на cube
, избегает этих разрывов.