Перейти к основному содержанию
Перейти к основному содержанию

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

Geohash

Geohash — это система геокодирования, которая разбивает поверхность Земли на ячейки сетки и кодирует каждую ячейку в короткую строку из букв и цифр. Это иерархическая структура данных, поэтому чем длиннее строка geohhash, тем точнее будет указано географическое местоположение.

Если вам нужно вручную преобразовать географические координаты в строки geohash, вы можете использовать geohash.org.

geohashEncode

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

Синтаксис

geohashEncode(longitude, latitude, [precision])

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

  • longitude — Долготная часть координаты, которую нужно закодировать. Вещественное число в диапазоне [-180°, 180°]. Float.
  • latitude — Широтная часть координаты, которую нужно закодировать. Вещественное число в диапазоне [-90°, 90°]. Float.
  • precision (необязательно) — Длина результирующей закодированной строки. Значение по умолчанию — 12. Целое число в диапазоне [1, 12]. Int8.
Примечание
  • Все параметры координат должны быть одного типа: либо Float32, либо Float64.
  • Для параметра precision любое значение меньше 1 или больше 12 автоматически преобразуется в 12.

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

  • Буквенно-цифровая строка закодированной координаты (используется модифицированный вариант алфавита кодирования base32). String.

Пример

Запрос:

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

Результат:

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

geohashDecode

Декодирует любую строку, закодированную с помощью geohash, в значения долготы и широты.

Синтаксис

geohashDecode(hash_str)

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

  • hash_str — строка в кодировке Geohash.

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

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

Пример

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

geohashesInBox

Возвращает массив строк, закодированных в geohash с заданной точностью, которые находятся внутри заданного прямоугольника или пересекают его границы, по сути представляя собой 2D‑сетку, развёрнутую в одномерный массив.

Синтаксис

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 длины precision, соответствующих 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'] │
└─────────────────────────────────────────────┘