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) │
└───────────────────────────────────────────┘