2020-07-28 07:57:28 +00:00
---
2022-04-09 13:29:05 +00:00
sidebar_label: "Функции для работы с системой Geohash"
2020-07-28 07:57:28 +00:00
---
# Функции для работы с системой Geohash {#geohash}
2021-07-29 15:20:55 +00:00
[Geohash ](https://en.wikipedia.org/wiki/Geohash ) — это система геокодирования, которая делит поверхность Земли на участки в виде "решетки", и каждую ячейку решетки кодирует в виде строки из букв и цифр. Система поддерживает иерархию (вложенность) ячеек, поэтому чем точнее определена геопозиция, тем длиннее строка с кодом соответствующей ячейки.
2020-07-28 07:57:28 +00:00
Для ручного преобразования географических координат в строку 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
2021-03-13 18:18:45 +00:00
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res;
2020-07-28 07:57:28 +00:00
```
``` text
┌─res──────────┐
│ ezs42d000000 │
└──────────────┘
```
## geohashDecode {#geohashdecode}
Декодирует любую строку, закодированную в [geohash ](#geohash ), на долготу и широту.
``` sql
geohashDecode(geohash_string)
```
**Входные значения**
- `geohash_string` — строка, содержащая geohash.
**Возвращаемые значения**
- `(longitude, latitude)` — широта и долгота. Кортеж из двух значений типа `Float64` .
**Пример**
``` sql
2021-03-13 18:18:45 +00:00
SELECT geohashDecode('ezs42') AS res;
2020-07-28 07:57:28 +00:00
```
``` text
┌─res─────────────────────────────┐
│ (-5.60302734375,42.60498046875) │
└─────────────────────────────────┘
```
## geohashesInBox {#geohashesinbox}
Формирует массив участков, которые находятся внутри или пересекают границу заданного участка на поверхности. Каждый участок описывается строкой [geohash ](#geohash ) заданной точности.
**Синтаксис**
``` sql
geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)
```
2021-03-13 18:18:45 +00:00
**Аргументы**
2020-07-28 07:57:28 +00:00
- `longitude_min` — минимальная долгота. Диапазон возможных значений: `[-180°, 180°]` . Тип данных: [Float ](../../../sql-reference/data-types/float.md )).
2021-03-13 18:18:45 +00:00
- `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 ).
2020-07-28 07:57:28 +00:00
2022-04-09 13:29:05 +00:00
:::info "Замечание"
2020-07-28 07:57:28 +00:00
В с е передаваемые координаты должны быть одного и того же типа: либо `Float32` , либо `Float64` .
**Возвращаемые значения**
2021-07-29 15:20:55 +00:00
- Массив строк, описывающих участки, покрывающие заданный участок. Длина каждой строки соответствует точности geohash. Порядок строк — произвольный.
2020-07-28 07:57:28 +00:00
- \[\] - Если переданные минимальные значения широты и долготы больше соответствующих максимальных значений, функция возвращает пустой массив.
Тип данных: [Array ](../../../sql-reference/data-types/array.md )([String](../../../sql-reference/data-types/string.md)).
2022-04-09 13:29:05 +00:00
:::info "Замечание"
2020-07-28 07:57:28 +00:00
Если возвращаемый массив содержит свыше 10 000 000 элементов, функция сгенерирует исключение.
**Пример**
Запрос:
``` sql
2021-03-13 18:18:45 +00:00
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos;
2020-07-28 07:57:28 +00:00
```
2021-03-13 18:18:45 +00:00
2020-07-28 07:57:28 +00:00
Результат:
``` text
┌─thasos──────────────────────────────────────┐
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
└─────────────────────────────────────────────┘
```