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 <@> point | float8 | Вычисляет расстояние в сухопутных милях между точками на поверхности Земли |
Изменение функции earth()
не повлияет на результат этого оператора.
Доработка
Доработка не проводилась.
Ограничения
Ограничения отсутствуют.
Установка
При наличии прав администратора СУБД включение модуля возможно выполнить вручную:
CREATE EXTENSION earthdistance CASCADE SCHEMA ext;
Расширения 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: https://www.postgresql.org/docs/15/earthdistance.html.