> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по географическим координатам

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

<div id="greatcircledistance">
  ## greatCircleDistance
</div>

Вычисляет расстояние между двумя точками на поверхности Земли по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance).

```sql theme={null}
greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
```

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

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

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

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

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

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

**Пример**

```sql theme={null}
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) AS greatCircleDistance
```

```text theme={null}
┌─greatCircleDistance─┐
│            14128352 │
└─────────────────────┘
```

<div id="geodistance">
  ## geoDistance
</div>

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

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

```sql theme={null}
geoDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
```

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

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

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

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

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

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

**Пример**

```sql theme={null}
SELECT geoDistance(38.8976, -77.0366, 39.9496, -75.1503) AS geoDistance
```

```text theme={null}
┌─geoDistance─┐
│   212458.73 │
└─────────────┘
```

<div id="greatcircleangle">
  ## greatCircleAngle
</div>

Вычисляет центральный угол между двумя точками на земной поверхности по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance).

```sql theme={null}
greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
```

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

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

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

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

**Пример**

```sql theme={null}
SELECT greatCircleAngle(0, 0, 45, 0) AS arc
```

```text theme={null}
┌─arc─┐
│  45 │
└─────┘
```

<div id="pointinellipses">
  ## pointInEllipses
</div>

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

```sql theme={null}
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`, если нет.

**Пример**

```sql theme={null}
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
```

```text theme={null}
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
│                                               1 │
└─────────────────────────────────────────────────┘
```

<div id="pointinpolygon">
  ## pointInPolygon
</div>

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

```sql theme={null}
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
```

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

* `(x, y)` — Координаты точки на плоскости. Тип данных — [Tuple](/ru/reference/data-types/tuple) — кортеж из двух чисел.
* `[(a, b), (c, d) ...]` — Вершины полигона. Тип данных — [Array](/ru/reference/data-types/array). Каждая вершина задаётся парой координат `(a, b)`. Вершины следует указывать по часовой стрелке или против часовой стрелки. Минимальное число вершин — 3. Полигон должен быть константой.
* Функция поддерживает полигоны с отверстиями (вырезанными областями). Тип данных — [Polygon](/ru/reference/data-types/geo#polygon). Либо передайте весь `Polygon` как второй аргумент, либо сначала передайте внешний Ring, а затем каждое отверстие как отдельный дополнительный аргумент.
* Функция также поддерживает `MultiPolygon`. Тип данных — [MultiPolygon](/ru/reference/data-types/geo#multipolygon). Либо передайте весь `MultiPolygon` как второй аргумент, либо перечислите каждый входящий в него полигон как отдельный аргумент.

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

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

**Пример**

```sql theme={null}
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
```

```text theme={null}
┌─res─┐
│   1 │
└─────┘
```

> **Примечание**
> • Вы можете установить `validate_polygons = 0`, чтобы отключить проверку геометрии.
> • `pointInPolygon` исходит из того, что каждый полигон сформирован корректно. Если входной полигон самопересекается, содержит кольца в неправильном порядке или перекрывающиеся рёбра, результаты становятся ненадёжными — особенно для точек, которые лежат точно на ребре, в вершине или внутри самопересечения, где невозможно однозначно определить, что считать "внутри", а что — "снаружи".
> • Когда аргумент полигона является константой, а точка задаётся с использованием индексируемых столбцов ключа (например, `pointInPolygon((x, y), constant_polygon)` в таблице, где `x, y` входят в `PRIMARY KEY` или покрываются индексом `minmax`), ClickHouse может использовать и первичный ключ, и индексы пропуска данных `minmax`, чтобы отсечь нерелевантные гранулы.
