Skip to main content

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

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

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

geohashEncode

Кодирует широту и долготу в строку geohash.

geohashEncode(longitude, latitude, [precision])

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

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

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

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

Пример

SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res;
┌─res──────────┐
│ ezs42d000000 │
└──────────────┘

geohashDecode

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

geohashDecode(geohash_string)

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

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

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

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

Пример

SELECT geohashDecode('ezs42') AS res;
┌─res─────────────────────────────┐
│ (-5.60302734375,42.60498046875) │
└─────────────────────────────────┘

geohashesInBox

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

Синтаксис

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

Аргументы

  • longitude_min — минимальная долгота. Диапазон возможных значений: [-180°, 180°]. Тип данных: Float).
  • latitude_min — минимальная широта. Диапазон возможных значений: [-90°, 90°]. Тип данных: Float.
  • longitude_max — максимальная долгота. Диапазон возможных значений: [-180°, 180°]. Тип данных: Float.
  • latitude_max — максимальная широта. Диапазон возможных значений: [-90°, 90°]. Тип данных: Float.
  • precision — точность geohash. Диапазон возможных значений: [1, 12]. Тип данных: UInt8.
Замечание

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

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

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

Тип данных: Array(String).

Замечание

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

Пример

Запрос:

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

Результат:

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