F.18. earthdistance#

F.18. earthdistance

F.18. earthdistance

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

В этом модуле предполагается, что Земля является идеально сферической. (Если это слишком неточно для вас, вы можете обратить внимание на проект PostGIS .)

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

Предостережение

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

F.18.1. Расстояния на основе кубов Земли

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

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

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

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

Все предоставленные функции показаны в Таблица F.5.

Таблица F.5. Функции на основе кубов для определения расстояния между точками на Земле

Функция

Описание

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

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


F.18.2. Расстояния на основе точек на Земле

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

Вам предоставляется только один оператор, показанный в Таблица F.6.

Таблица F.6. Операторы на основе точек для расстояния между земными точками

Оператор

Описание

point <@> pointfloat8

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


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

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