# Геопространственные функции

### GEODIST()
`GEODIST(lat1, lon1, lat2, lon2, [...])` функция вычисляет геодезическое расстояние между двумя точками, заданными их координатами. Обратите внимание, что по умолчанию и широты, и долготы должны быть в **радианах**, а результат будет в **метрах**. Вы можете использовать произвольные выражения для любой из четырех координат. Оптимальный путь будет выбран, когда одна пара аргументов напрямую ссылается на пару атрибутов, а другая — является константой.

`GEODIST()` также принимает необязательный 5-й аргумент, позволяющий легко преобразовывать входные и выходные единицы и выбирать конкретную формулу геодезического расстояния для использования. Полный синтаксис и несколько примеров приведены ниже:

```sql
GEODIST(lat1, lon1, lat2, lon2, { option=value, ... })

GEODIST(40.7643929, -73.9997683, 40.7642578, -73.9994565, {in=degrees, out=feet})

GEODIST(51.50, -0.12, 29.98, 31.13, {in=deg, out=mi})
```

Известные опции и их значения:

* `in = {deg | degrees | rad | radians}`, задаёт единицы входных данных;
* `out = {m | meters | km | kilometers | ft | feet | mi | miles | yd | yards | in | inch | cm | centimeters | mm | millimeters | NM | nmi | nauticalmiles}`, задаёт единицы выходных данных;
* `method = {adaptive | haversine}`, задаёт метод вычисления геодезического расстояния.

Метод по умолчанию — "adaptive". Это хорошо оптимизированная реализация, которая всегда точнее *и* значительно быстрее, чем "haversine".

### GEOPOLY2D()
`GEOPOLY2D(lat1,lon1,lat2,lon2,lat3,lon3...)` создаёт полигон, используемый с функцией [CONTAINS()](../Functions/Arrays_and_conditions_functions.md#CONTAINS%28%29). Эта функция учитывает кривизну Земли, разбивая полигон на меньшие части, и должна использоваться для больших территорий. Для небольших площадей можно использовать функцию [POLY2D()](../Functions/Geo_spatial_functions.md#POLY2D%28%29). Функция ожидает, что координаты — это пары широты/долготы в градусах; если используются радианы, результат будет таким же, как у `POLY2D()`.

### POLY2D()
`POLY2D(x1,y1,x2,y2,x3,y3...)` создаёт полигон, используемый с функцией [CONTAINS()](../Functions/Arrays_and_conditions_functions.md#CONTAINS%28%29). Этот полигон предполагает плоскую Землю, поэтому его площадь не должна быть слишком большой; для больших территорий следует использовать функцию [GEOPOLY2D()](../Functions/Geo_spatial_functions.md#GEOPOLY2D%28%29), которая учитывает кривизну Земли.

<!-- proofread -->

