跳至主要内容

使用 S2 索引的函数

S2 索引

S2 是一个地理索引系统,其中所有地理数据都以三维球体(类似于地球仪)表示。

在 S2 库中,点表示为 S2 索引 - 一个特定数字,它在内部编码单位球体表面上的点,与传统的(纬度,经度)对不同。要获得给定点的 S2 点索引,该点以 (纬度,经度) 格式指定,请使用 geoToS2 函数。此外,您可以使用 s2ToGeo 函数来获取与指定 S2 点索引相对应的地理坐标。

geoToS2

返回与提供的坐标 (经度,纬度) 相对应的 S2 点索引。

语法

geoToS2(lon, lat)

参数

返回值

示例

查询

SELECT geoToS2(37.79506683, 55.71290588) AS s2Index;

结果

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

s2ToGeo

返回与提供的 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)

参数

  • siIndex1s2index2 — S2 索引。 UInt64.

返回值

  • 1 — 如果单元格相交。 UInt8.
  • 0 — 如果单元格不相交。 UInt8.

示例

查询

SELECT s2CellsIntersect(9926595209846587392, 9926594385212866560) AS intersect;

结果

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

s2CapContains

确定一个球冠是否包含一个 S2 点。一个球冠表示球体的一部分,该部分已被平面切断。它由球体上的一个点和一个以度为单位的半径定义。

语法

s2CapContains(center, degrees, point)

参数

  • center — 与球冠相对应的 S2 点索引。 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)

参数

  • center1center2 — 与两个输入球冠相对应的 S2 点索引。 UInt64.
  • radius1radius2 — 两个输入球冠的半径,以度为单位。 Float64.

返回值

  • center — 与包含两个输入球冠的最小球冠的中心相对应的 S2 点索引。 UInt64.
  • radius — 包含两个输入球冠的最小球冠的半径。 Float64.

示例

查询

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

结果

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

s2RectAdd

增加边界矩形的大小以包含给定的 S2 点。在 S2 系统中,矩形由称为 S2LatLngRect 的 S2Region 类型表示,该类型表示纬度 - 经度空间中的矩形。

语法

s2RectAdd(s2pointLow, s2pointHigh, s2Point)

参数

  • s2PointLow — 与矩形相对应的低 S2 点索引。 UInt64.
  • s2PointHigh — 与矩形相对应的高 S2 点索引。 UInt64.
  • s2Point — 目标 S2 点索引,边界矩形应扩大以包含该索引。 UInt64.

返回值

  • s2PointLow — 与扩展矩形相对应的低 S2 单元格 ID。 UInt64.
  • s2PointHigh — 与扩展矩形相对应的高 S2 单元格 ID。 UInt64.

示例

查询

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

结果

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

s2RectContains

确定给定的矩形是否包含一个 S2 点。在 S2 系统中,矩形由称为 S2LatLngRect 的 S2Region 类型表示,该类型表示纬度 - 经度空间中的矩形。

语法

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 系统中,矩形由称为 S2LatLngRect 的 S2Region 类型表示,该类型表示纬度 - 经度空间中的矩形。

语法

s2RectUnion(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)

参数

  • s2Rect1PointLows2Rect1PointHi — 与第一个矩形相对应的低和高 S2 点索引。 UInt64.
  • s2Rect2PointLows2Rect2PointHi — 与第二个矩形相对应的低和高 S2 点索引。 UInt64.

返回值

  • s2UnionRect2PointLow — 与并集矩形相对应的低 S2 单元格 ID。 UInt64.
  • s2UnionRect2PointHi — 与并集矩形相对应的高 S2 单元格 ID。 UInt64.

示例

查询

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

结果

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

s2RectIntersection

返回包含此矩形和给定矩形交集的最小矩形。在 S2 系统中,矩形由称为 S2LatLngRect 的 S2Region 类型表示,该类型表示纬度 - 经度空间中的矩形。

语法

s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)

参数

  • s2Rect1PointLows2Rect1PointHi — 与第一个矩形相对应的低和高 S2 点索引。 UInt64.
  • s2Rect2PointLows2Rect2PointHi — 与第二个矩形相对应的低和高 S2 点索引。 UInt64.

返回值

  • s2UnionRect2PointLow — 与包含给定矩形的交集的矩形相对应的低 S2 单元格 ID。 UInt64.
  • s2UnionRect2PointHi — 与包含给定矩形的交集的矩形相对应的高 S2 单元格 ID。 UInt64.

示例

查询

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

结果

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