S2 索引相关函数
S2Index
S2 是一个地理索引系统,其中所有地理数据都表示在三维球体上(类似于地球仪)。
在 S2 库中,点表示为 S2 索引 - 一个特定的数字,其内部编码了单位球面上的一个点,这与传统的(纬度,经度)对不同。要获取以(纬度,经度)格式指定的给定点的 S2 点索引,请使用 geoToS2 函数。此外,您可以使用 s2ToGeo 函数来获取与指定的 S2 点索引对应的地理坐标。
geoToS2
返回与提供的坐标 (longitude, latitude) 对应的 S2 点索引。
语法
geoToS2(lon, lat)
参数
lon— 经度。Float64。lat— 纬度。Float64。
返回值
- S2 点索引。UInt64。
示例
查询
SELECT geoToS2(37.79506683, 55.71290588) AS s2Index;
结果
┌─────────────s2Index─┐
│ 4704772434919038107 │
└─────────────────────┘
s2ToGeo
返回与提供的 S2 点索引对应的地理坐标 (longitude, latitude)。
语法
s2ToGeo(s2index)
参数
s2index— S2 索引。UInt64。
返回值
- 一个由两个值组成的 tuple
lon。Float64。lat。Float64。
示例
查询
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 点。Cap 表示球体的一部分,该部分已被平面切割掉。它由球体上的一个点和以度为单位的半径定义。
语法
s2CapContains(center, degrees, point)
参数
center— 与 cap 对应的 S2 点索引。UInt64。degrees— cap 的半径,以度为单位。Float64。point— S2 点索引。UInt64。
返回值
1— 如果 cap 包含 S2 点索引。UInt8。0— 如果 cap 不包含 S2 点索引。UInt8。
示例
查询
SELECT s2CapContains(1157339245694594829, 1.0, 1157347770437378819) AS capContains;
结果
┌─capContains─┐
│ 1 │
└─────────────┘
s2CapUnion
确定包含给定两个输入 cap 的最小 cap。Cap 表示球体的一部分,该部分已被平面切割掉。它由球体上的一个点和以度为单位的半径定义。
语法
s2CapUnion(center1, radius1, center2, radius2)
参数
center1,center2— 与两个输入 cap 对应的 S2 点索引。UInt64。radius1,radius2— 两个输入 cap 的半径,以度为单位。Float64。
返回值
center— 与包含两个输入 cap 的最小 cap 的中心对应的 S2 点索引。UInt64。radius— 包含两个输入 cap 的最小 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 单元格 ID。UInt64。s2PointHigh— 与扩大的矩形对应的高 S2 单元格 ID。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 单元格 ID。UInt64。s2UnionRect2PointHi— 与并集矩形对应的高 S2 单元格 ID。UInt64。
示例
查询
SELECT s2RectUnion(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectUnion;
结果
┌─rectUnion─────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘
s2RectIntersection
返回包含此矩形和给定矩形交集的最小矩形。在 S2 系统中,矩形由一种名为 S2Region 的类型表示,称为 S2LatLngRect,它表示经纬度空间中的矩形。
语法
s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)
参数
s2Rect1PointLow,s2Rect1PointHi— 与第一个矩形对应的低和高 S2 点索引。UInt64。s2Rect2PointLow,s2Rect2PointHi— 与第二个矩形对应的低和高 S2 点索引。UInt64。
返回值
s2UnionRect2PointLow— 与包含给定矩形交集的矩形对应的低 S2 单元格 ID。UInt64。s2UnionRect2PointHi— 与包含给定矩形交集的矩形对应的高 S2 单元格 ID。UInt64。
示例
查询
SELECT s2RectIntersection(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectIntersection;
结果
┌─rectIntersection──────────────────────────┐
│ (5178914411069187297,5177056748191934217) │
└───────────────────────────────────────────┘