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

Функции для работы с географическими координатами

greatCircleDistance

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

greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

Входные параметры

  • lon1Deg — долгота первой точки в градусах. Диапазон: [-180°, 180°].
  • lat1Deg — широта первой точки в градусах. Диапазон: [-90°, 90°].
  • lon2Deg — долгота второй точки в градусах. Диапазон: [-180°, 180°].
  • lat2Deg — широта второй точки в градусах. Диапазон: [-90°, 90°].

Положительные значения соответствуют северной широте и восточной долготе, отрицательные значения — южной широте и западной долготе.

Возвращаемое значение

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

Выбрасывает исключение, если значения входных параметров выходят за указанный диапазон.

Пример

SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) AS greatCircleDistance
┌─greatCircleDistance─┐
│            14128352 │
└─────────────────────┘

geoDistance

Аналогична greatCircleDistance, но вычисляет расстояние на эллипсоиде WGS-84 вместо сферы. Это более точное приближение геоида Земли. Производительность такая же, как у greatCircleDistance (без потери производительности). Рекомендуется использовать geoDistance для вычисления расстояний на Земле.

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

geoDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

Входные параметры

  • lon1Deg — долгота первой точки в градусах. Диапазон: [-180°, 180°].
  • lat1Deg — широта первой точки в градусах. Диапазон: [-90°, 90°].
  • lon2Deg — долгота второй точки в градусах. Диапазон: [-180°, 180°].
  • lat2Deg — широта второй точки в градусах. Диапазон: [-90°, 90°].

Положительные значения соответствуют северной широте и восточной долготе, отрицательные — южной широте и западной долготе.

Возвращаемое значение

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

Вызывает исключение, если значения входных параметров выходят за пределы диапазона.

Пример

SELECT geoDistance(38.8976, -77.0366, 39.9496, -75.1503) AS geoDistance
┌─geoDistance─┐
│   212458.73 │
└─────────────┘

greatCircleAngle

Вычисляет центральный угол между двумя точками на поверхности Земли с использованием формулы ортодромии.

greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

Входные параметры

  • lon1Deg — долгота первой точки в градусах.
  • lat1Deg — широта первой точки в градусах.
  • lon2Deg — долгота второй точки в градусах.
  • lat2Deg — широта второй точки в градусах.

Возвращаемое значение

Центральный угол между двумя точками в градусах.

Пример

SELECT greatCircleAngle(0, 0, 45, 0) AS arc
┌─arc─┐
│  45 │
└─────┘

pointInEllipses

Проверяет, принадлежит ли точка хотя бы одному из эллипсов. Координаты задаются в геометрическом (декартовом) пространстве.

pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)

Входные параметры

  • x, y — координаты точки на плоскости.
  • xᵢ, yᵢ — координаты центра i-го эллипса.
  • aᵢ, bᵢ — длины полуосей i-го эллипса в единицах координат x, y.

Количество входных параметров должно быть равно 2+4⋅n, где n — число эллипсов.

Возвращаемые значения

1, если точка находится внутри хотя бы одного из эллипсов; 0, если не находится.

Пример

SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
│                                               1 │
└─────────────────────────────────────────────────┘

pointInPolygon

Проверяет, лежит ли точка внутри многоугольника на плоскости.

pointInPolygon((x, y), [(a, b), (c, d) ...], ...)

Входные значения

  • (x, y) — координаты точки на плоскости. Тип данных — Tuple — кортеж из двух чисел.
  • [(a, b), (c, d) ...] — вершины многоугольника. Тип данных — Array. Каждая вершина представлена парой координат (a, b). Вершины должны быть заданы по или против часовой стрелки. Минимальное количество вершин — 3. Многоугольник должен задаваться константным выражением.
  • Функция поддерживает многоугольники с отверстиями (вырезанными областями). Тип данных — Polygon. Либо передайте весь Polygon вторым аргументом, либо передайте сначала внешнее кольцо, а затем каждое отверстие — отдельным дополнительным аргументом.
  • Функция также поддерживает мультиполигон. Тип данных — MultiPolygon. Либо передайте весь MultiPolygon вторым аргументом, либо перечислите каждый составляющий многоугольник отдельным аргументом.

Возвращаемые значения

1, если точка находится внутри многоугольника, 0, если нет. Если точка лежит на границе многоугольника, функция может вернуть как 0, так и 1.

Пример

SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
┌─res─┐
│   1 │
└─────┘

Примечание
• Вы можете установить validate_polygons = 0, чтобы отключить проверку корректности геометрии.
pointInPolygon предполагает, что каждый полигон корректно задан. Если входные данные содержат самопересечения, неправильно упорядоченные кольца или перекрывающиеся рёбра, результаты становятся ненадёжными — особенно для точек, которые лежат точно на ребре, вершине или внутри области самопересечения, где понятия «внутри» и «снаружи» не определены.