Lindorm Ganos时空服务扩展了云原生多模数据库 Lindorm原有的主键索引和二级索引能力来提高时空查询速度。时空查询是指查询条件中包含空间列(经纬度坐标或Geometry类型的列)或者空间和时间组合列(经纬度坐标或Geometry类型的列+时间列
)的查询。本文介绍时空索引的概念、分类和使用场景。
Z-ORDER索引
在创建主键索引或二级索引时,通过加入Z-ORDER
索引函数来为空间列或者空间和时间组合列添加索引。Z-ORDER
索引函数返回一个编码值(称为Z-ORDER编码或时空编码),该编码值作为主键索引或二级索引的一部分。因此,时空索引并不是一个独立的索引,而是内嵌到Lindorm主键索引或二级索引中来实现加速时空查询的需求。
Z-ORDER函数索引分类
Z-ORDER主键索引
Z-ORDER编码作为主键索引的组成部分,此时主键索引为Z-ORDER主键索引。例如:PRIMARY KEY(Z-ORDER(g))
。
Z-ORDER二级索引
Z-ORDER编码作为二级索引的组成部分,此时二级索引为Z-ORDER二级索引。例如:Z-ORDER(g)
。
创建Z-ORDER索引的方法请参见创建时空索引。
Z-ORDER函数说明
Lindorm Ganos根据Z-ORDER
索引函数的入参自动计算出不同的时空编码,Z-ORDER
索引函数的类型和说明如下表。
当两个空间对象在位置上足够相近时(厘米级别),Z-ORDER
索引函数生成的时空编码可能相同。
类型 | 参数说明 | 适用场景 |
|
| 为点数据创建索引,当查询条件包含空间范围时,可使用该索引进行加速。 |
|
| 为点数据和时间创建索引,当查询条件包含时间范围和空间范围时,可使用该索引进行加速。 |
|
| 为线或者面数据创建索引,当查询条件包含空间范围时,可使用该索引进行加速。 |
|
| 为线数据和时间、面数据和时间创建索引,当查询条件包含时间范围和空间范围时,可使用该索引进行加速。 |
网格二级索引
仅2.6.5以上版本的宽表引擎支持网格二级索引功能。
在创建索引时,如果对Geometry(目前支持POLYGON、MULTIPOLYGON、LINESTRING、MULTILINESTRING)列使用了S2索引函数,宽表引擎会自动构建网格二级索引。使用网格二级索引可以实现基于网格的过滤和计算功能。
网格二级索引根据Google S2算法,将空间划分成均匀大小的网格(S2Cell),每个网格对应一个唯一ID(S2CellID)。每个网格都会与一个面或多个面相交,这些相交信息都会被记录在索引中。
S2索引函数说明
语法
输入几何对象和精度,计算几何对象覆盖到的该精度下的网格,并返回网格ID(S2CellID)的集合。创建网格索引的方法请参见创建时空索引。
Set<Long> S2(String geomColumnName, int level)
参数说明
参数 | 说明 |
geomColumnName | 面类型(POLYGON或MULTIPOLYGON)或线类型(LINESTRING或MULTILINESTRING)列的列名,该列存储的空间数据坐标需为WGS84坐标系坐标。 重要 仅宽表引擎2.6.7.5及以上版本,支持线类型(LINESTRING或MULTILINESTRING)。如果您的宽表引擎无法通过控制台进行升级,请联系Lindorm技术支持(钉钉号:s0s3eg3)。 |
level | S2网格精度,取值范围为[1,30]。 |
索引选择
Z-ORDER索引适用场景
Z-ORDER索引对空间点类型数据有较好的过滤效果,当查询条件涉及到对空间点位置关系判断时,您可以根据Z-ORDER函数的适用场景,选择适合的函数创建索引。Z-ORDER函数的适用场景,请参见Z-ORDER函数说明。
以下是使用Z-ORDER索引的最佳实践场景:
时空范围查询:查询过去某段时间内车辆在某个区域的行驶轨迹。具体实现,请参见Lindorm Ganos时空服务轨迹处理实测。
周边查询:查询某位置附近一定距离内的车辆,返回车辆的实时位置。具体实现,请参见Lindorm Ganos时空服务轨迹处理实测。
轨迹出入统计:统计出轨迹点出入某个区域的信息,包括:驶入时间、驶出时间、停留时长、轨迹数量等。具体实现,请参见Lindorm Ganos时空服务-轨迹出入点统计。
同时,Z-ORDER索引对线或面类型数据也有一定的过滤效果,可以支持简单的过滤查询,例如:
对线类型:查询某位置附近一定距离内的道路,每条道路是一个LINESTRING或MULTILINESTRING。
对面类型:查询落在某个范围内的商圈,每个商圈是一个POLYGON或MULTIPOLYGON。
网格二级索引适用场景
网格二级索引较Z-ORDER索引对线或面有更好的过滤效果。对于非聚合查询,使用网格二索引可有效过滤掉与查询条件不相关的网格内的数据,加速查询,例如:
围栏监测:实时查询轨迹点落在哪些围栏内,可达到百万级围栏数据毫秒级返回结果。
周边查询:实时查询某位置周边一定半径范围内的商区。
同时,网格索引可以随时更新存储统计数据,可基于网格进行快速聚合统计,例如:
统计数量:以网格为单位统计商区数量、轨迹数量等。
统计区域属性:以网格为单位统计植被覆盖率、交易量总和等指标。