---
slug: /ru/sql-reference/functions/geo/geohash
sidebar_label: "Функции для работы с системой Geohash"
---

# Функции для работы с системой Geohash {#geohash}

[Geohash](https://en.wikipedia.org/wiki/Geohash) — это система геокодирования, которая делит поверхность Земли на участки в виде "решетки", и каждую ячейку решетки кодирует в виде строки из букв и цифр. Система поддерживает иерархию (вложенность) ячеек, поэтому чем точнее определена геопозиция, тем длиннее строка с кодом соответствующей ячейки.

Для ручного преобразования географических координат в строку geohash можно использовать сайт [geohash.org](http://geohash.org/).

## geohashEncode {#geohashencode}

Кодирует широту и долготу в строку [geohash](#geohash).

``` sql
geohashEncode(longitude, latitude, [precision])
```

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

-   longitude — долгота. Диапазон — `[-180°, 180°].`
-   latitude — широта. Диапазон — `[-90°, 90°].`
-   precision — длина результирующей строки, по умолчанию `12`. Опционально. Целое число в диапазоне `[1, 12]`. Любое значение меньше, чем `1` или больше `12` автоматически преобразуются в `12`.

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

-   Строка с координатой, закодированной модифицированной версией алфавита base32.

**Пример**

``` sql
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res;
```

``` text
┌─res──────────┐
│ ezs42d000000 │
└──────────────┘
```

## geohashDecode {#geohashdecode}

Декодирует любую строку, закодированную в [geohash](#geohash), на долготу и широту.

``` sql
geohashDecode(geohash_string)
```

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

-   `geohash_string` — строка, содержащая geohash.

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

-   `(longitude, latitude)` — широта и долгота. Кортеж из двух значений типа `Float64`.

**Пример**

``` sql
SELECT geohashDecode('ezs42') AS res;
```

``` text
┌─res─────────────────────────────┐
│ (-5.60302734375,42.60498046875) │
└─────────────────────────────────┘
```

## geohashesInBox {#geohashesinbox}

Формирует массив участков, которые находятся внутри или пересекают границу заданного участка на поверхности. Каждый участок описывается строкой [geohash](#geohash) заданной точности.

**Синтаксис**

``` sql
geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)
```

**Аргументы**

-   `longitude_min` — минимальная долгота. Диапазон возможных значений: `[-180°, 180°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md)).
-   `latitude_min` — минимальная широта. Диапазон возможных значений: `[-90°, 90°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md).
-   `longitude_max` — максимальная долгота. Диапазон возможных значений: `[-180°, 180°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md).
-   `latitude_max` — максимальная широта. Диапазон возможных значений: `[-90°, 90°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md).
-   `precision` — точность geohash. Диапазон возможных значений: `[1, 12]`. Тип данных: [UInt8](../../../sql-reference/data-types/int-uint.md).

:::info Замечание
Все передаваемые координаты должны быть одного и того же типа: либо `Float32`, либо `Float64`.
:::

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

-   Массив строк, описывающих участки, покрывающие заданный участок. Длина каждой строки соответствует точности geohash. Порядок строк — произвольный.
-   \[\] - Если переданные минимальные значения широты и долготы больше соответствующих максимальных значений, функция возвращает пустой массив.

Тип данных: [Array](../../../sql-reference/data-types/array.md)([String](../../../sql-reference/data-types/string.md)).

:::info Замечание
Если возвращаемый массив содержит свыше 10 000 000 элементов, функция сгенерирует исключение.
:::

**Пример**

Запрос:

``` sql
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos;
```

Результат:

``` text
┌─thasos──────────────────────────────────────┐
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
└─────────────────────────────────────────────┘
```
