F.17. earthdistance — вычисление расстояний между точками на Земле #
Модуль earthdistance
реализует два разных варианта вычисления ортодромии (расстояния между точками на поверхности Земли). Первый описанный вариант зависит от модуля cube
. Второй вариант основан на встроенном типе данных point
, в котором в качестве координат задаются широта и долгота.
В этом модуле Земля считается идеальной сферой. (Если для вас это слишком грубо, обратите внимание на проект PostGIS.)
Прежде чем устанавливать earthdistance
, вы должны установить модуль cube
(хотя можно воспользоваться указанием CASCADE
команды CREATE EXTENSION
и установить сразу оба расширения).
Внимание
Расширения earthdistance
и cube
настоятельно рекомендуется устанавливать в одну схему, и при этом в данной схеме недоверенные пользователи не должны в настоящем и будущем иметь право CREATE. В противном случае, если в схеме earthdistance
окажутся объекты, созданные злонамеренным пользователем, возможна угроза безопасности. Более того, используя функции earthdistance
после установки расширения, следует ограничивать путь поиска только доверенными схемами.
F.17.1. Земные расстояния по кубам #
Данные хранятся в кубах, представляющих точки (оба угла куба совпадают) по 3 координатам, выражающим смещения x, y и z от центра Земли. Этот модуль предоставляет домен earth
на базе cube
, включающий проверки того, что значение соответствует этим ограничениям и представляет точку, достаточно близкую к сферической поверхности Земли.
Радиус Земли выдаёт функция earth()
(в метрах). Изменив одну эту функцию, вы можете сделать так, чтобы модуль работал с другими единицами, либо выдать другое значение радиуса, которое кажется вам более подходящим.
Этот пакет может также применяться и для астрономических расчётов. Астрономы обычно меняют функцию earth()
, чтобы она возвращала радиус, равный 180/pi()
, и расстояния в результате выдавались в градусах.
В этом модуле реализованы функции для ввода данных, выражающих широту и долготу (в градусах), для вывода ширины и долготы, для вычисления ортодромии между двумя точками и простого указания окружающего прямоугольника, что полезно для поиска по индексу.
Предоставляемые этим модулем функции показаны в Таблица F.8.
Таблица F.8. Функции земных расстояний по кубам
F.17.2. Земные расстояния по точкам #
Вторая часть этого модуля основана на представлении точек на Земле в виде значений типа point
, в которых первый компонент представляет долготу в градусах, а второй — широту. Точки воспринимаются как (долгота, широта), а не наоборот, так как долгота ближе к интуитивному представлению как оси X, а широта — оси Y.
В модуле реализован один оператор, показанный в Таблице F.9.
Таблица F.9. Операторы земных расстояний по точкам
Оператор Описание |
---|
Вычисляет расстояние в сухопутных милях между точками на поверхности Земли. |
Заметьте, что в этой части модуля, в отличие от части, построенной на cube
, единицы зашиты жёстко: изменение функции earth()
не повлияет на результат этого оператора.
Представление в виде долготы/широты плохо тем, что вам придётся учитывать граничные условия возле полюсов и в районе +/- 180 градусов долготы. Представление на базе cube
лишено таких нарушений непрерывности.