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

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

S2Index

S2 — это система географического индексирования, в которой все географические данные представляются на поверхности сферы (аналогично глобусу).

В библиотеке S2 точки представлены в виде индекса S2 — конкретного числа, которое кодирует точку на поверхности единичной сферы, в отличие от традиционных пар (широта, долгота). Чтобы получить индекс точки S2 для заданной точки в формате (широта, долгота), используйте функцию geoToS2. Также можно использовать функцию s2ToGeo для получения географических координат, соответствующих указанному индексу точки S2.

geoToS2

Возвращает индекс точки S2, соответствующий переданным координатам (longitude, latitude).

Синтаксис

geoToS2(lon, lat)

Аргументы

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

  • Индекс точки S2. UInt64.

Пример

Запрос:

SELECT geoToS2(37.79506683, 55.71290588) AS s2Index;

Результат:

┌─────────────s2Index─┐
│ 4704772434919038107 │
└─────────────────────┘

s2ToGeo

Возвращает географические координаты (longitude, latitude), соответствующие заданному индексу точки S2.

Синтаксис

s2ToGeo(s2index)

Аргументы

  • s2index — S2-индекс. UInt64.

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

Пример

Запрос:

SELECT s2ToGeo(4704772434919038107) AS s2Coodrinates;

Результат:

┌─s2Coodrinates────────────────────────┐
│ (37.79506681471008,55.7129059052841) │
└──────────────────────────────────────┘

s2GetNeighbors

Возвращает индексы соседних ячеек S2, соответствующие указанному S2. Каждая ячейка в системе S2 — это четырёхугольник, ограниченный четырьмя геодезическими линиями. Поэтому у каждой ячейки 4 соседа.

Синтаксис

s2GetNeighbors(s2index)

Аргументы

  • s2index — индекс S2. UInt64.

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

  • Массив, состоящий из 4 соседних индексов: array[s2index1, s2index3, s2index2, s2index4]. Array(UInt64).

Пример

Запрос:

SELECT s2GetNeighbors(5074766849661468672) AS s2Neighbors;

Результат:

┌─s2Neighbors───────────────────────────────────────────────────────────────────────┐
│ [5074766987100422144,5074766712222515200,5074767536856236032,5074767261978329088] │
└───────────────────────────────────────────────────────────────────────────────────┘

s2CellsIntersect

Определяет, пересекаются ли две указанные ячейки S2.

Синтаксис

s2CellsIntersect(s2index1, s2index2)

Аргументы

  • siIndex1, s2index2 — индекс S2. UInt64.

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

  • 1 — если ячейки пересекаются. UInt8.
  • 0 — если ячейки не пересекаются. UInt8.

Пример

Запрос:

SELECT s2CellsIntersect(9926595209846587392, 9926594385212866560) AS intersect;

Результат:

┌─intersect─┐
│         1 │
└───────────┘

s2CapContains

Определяет, содержит ли сферический сегмент (cap) точку S2. Сферический сегмент представляет собой часть сферы, отсечённую плоскостью. Он задаётся точкой на сфере и радиусом в градусах.

Синтаксис

s2CapContains(center, degrees, point)

Аргументы

  • center — индекс точки S2, соответствующей сферической шапке (cap). UInt64.
  • degrees — радиус шапки в градусах. Float64.
  • point — индекс точки S2. UInt64.

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

  • 1 — если шапка содержит индекс точки S2. UInt8.
  • 0 — если шапка не содержит индекс точки S2. UInt8.

Пример

Запрос:

SELECT s2CapContains(1157339245694594829, 1.0, 1157347770437378819) AS capContains;

Результат:

┌─capContains─┐
│           1 │
└─────────────┘

s2CapUnion

Определяет наименьшую сферическую шапку, которая содержит две заданные шапки. Сферическая шапка представляет собой часть сферы, отсечённую плоскостью. Она задаётся точкой на сфере и радиусом в градусах.

Синтаксис

s2CapUnion(center1, radius1, center2, radius2)

Аргументы

  • center1, center2 — индексы точек S2, соответствующие двум входным сферическим шапкам (cap). UInt64.
  • radius1, radius2 — радиусы двух входных сферических шапок (cap) в градусах. Float64.

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

  • center — индекс точки S2, соответствующий центру наименьшей сферической шапки (cap), содержащей две входные сферические шапки. UInt64.
  • radius — радиус наименьшей сферической шапки (cap), содержащей две входные сферические шапки. Float64.

Пример

Запрос:

SELECT s2CapUnion(3814912406305146967, 1.0, 1157347770437378819, 1.0) AS capUnion;

Результат:

┌─capUnion───────────────────────────────┐
│ (4534655147792050737,60.2088283994957) │
└────────────────────────────────────────┘

s2RectAdd

Увеличивает размер ограничивающего прямоугольника так, чтобы он включал заданную точку S2. В системе S2 прямоугольник представлен типом S2Region, называемым S2LatLngRect, который описывает прямоугольник в пространстве широты и долготы.

Синтаксис

s2RectAdd(s2pointLow, s2pointHigh, s2Point)

Аргументы

  • s2PointLow — нижний индекс точки S2, соответствующий прямоугольнику. UInt64.
  • s2PointHigh — верхний индекс точки S2, соответствующий прямоугольнику. UInt64.
  • s2Point — целевой индекс точки S2, который должен быть включён в расширенный прямоугольник. UInt64.

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

  • s2PointLow — нижний идентификатор ячейки S2, соответствующий расширенному прямоугольнику. UInt64.
  • s2PointHigh — верхний идентификатор ячейки S2, соответствующий расширенному прямоугольнику. UInt64.

Пример

Запрос:

SELECT s2RectAdd(5178914411069187297, 5177056748191934217, 5179056748191934217) AS rectAdd;

Результат:

┌─rectAdd───────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘

s2RectContains

Определяет, содержит ли заданный прямоугольник точку S2. В системе S2 прямоугольник представлен типом S2Region под названием S2LatLngRect, который задаёт прямоугольник в широтно-долготном пространстве.

Синтаксис

s2RectContains(s2PointLow, s2PointHi, s2Point)

Аргументы

  • s2PointLow — Нижний индекс точки S2, соответствующей прямоугольнику. UInt64.
  • s2PointHigh — Верхний индекс точки S2, соответствующей прямоугольнику. UInt64.
  • s2Point — Целевой индекс точки S2. UInt64.

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

  • 1 — если прямоугольник содержит заданную точку S2.
  • 0 — если прямоугольник не содержит заданную точку S2.

Пример

Запрос:

SELECT s2RectContains(5179062030687166815, 5177056748191934217, 5177914411069187297) AS rectContains;

Результат:

┌─rectContains─┐
│            0 │
└──────────────┘

s2RectUnion

Возвращает наименьший прямоугольник, содержащий объединение этого прямоугольника и указанного прямоугольника. В системе S2 прямоугольник представлен типом S2Region с названием S2LatLngRect, который описывает прямоугольник в пространстве широта–долгота.

Синтаксис

s2RectUnion(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)

Аргументы

  • s2Rect1PointLow, s2Rect1PointHi — нижний и верхний индексы точек S2, соответствующие первому прямоугольнику. UInt64.
  • s2Rect2PointLow, s2Rect2PointHi — нижний и верхний индексы точек S2, соответствующие второму прямоугольнику. UInt64.

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

  • s2UnionRect2PointLow — идентификатор ячейки S2, соответствующий нижней границе объединённого прямоугольника. UInt64.
  • s2UnionRect2PointHi — идентификатор ячейки S2, соответствующий верхней границе объединённого прямоугольника. UInt64.

Пример

Запрос:

SELECT s2RectUnion(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectUnion;

Результат:

┌─rectUnion─────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘

s2RectIntersection

Возвращает наименьший прямоугольник, содержащий пересечение этого прямоугольника с заданным прямоугольником. В системе S2 прямоугольник представляется типом S2RegionS2LatLngRect, который описывает прямоугольник в пространстве географических координат (широта/долгота).

Синтаксис

s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)

Аргументы

  • s2Rect1PointLow, s2Rect1PointHi — младший и старший индексы точек S2, соответствующие первому прямоугольнику. UInt64.
  • s2Rect2PointLow, s2Rect2PointHi — младший и старший индексы точек S2, соответствующие второму прямоугольнику. UInt64.

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

  • s2UnionRect2PointLow — младший идентификатор ячейки S2, соответствующий прямоугольнику, содержащему пересечение заданных прямоугольников. UInt64.
  • s2UnionRect2PointHi — старший идентификатор ячейки S2, соответствующий прямоугольнику, содержащему пересечение заданных прямоугольников. UInt64.

Пример

Запрос:

SELECT s2RectIntersection(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectIntersection;

Результат:

┌─rectIntersection──────────────────────────┐
│ (5178914411069187297,5177056748191934217) │
└───────────────────────────────────────────┘