Ganos内置了多个空间索引,用户只需在前端输入时空数据,并指定要建立的索引即可,不用再关心HBase的KV如何设计与构建,使用较为方便。

因此,在数据写入之前,需要先定义好索引表结构。

索引类型

Ganos目前支持四类索引,适应于不同的查询场景。这些索引可以同时存在,也可以根据需求只创建某个索引(如业务场景中只有周边范围查询,那么就只需要创建Z2索引,而不用创建其他索引)。

ID索引

适应于根据空间对象ID(称为FID)查询的场景,要求每个空间对象的FID必须唯一

Z2/XZ2索引

适应于空间查询,如地理围栏判断、周边范围查询等;其中Z2是用于「点」对象;XZ2用于「线」、「面」对象

Z3/XZ3索引

适应于时空查询,如某个空间范围以及时间段内的历史轨迹等;其中Z3是用于「点」对象;XZ3用于「线」、「面」对象

XYZ索引

适应于含有经度、纬度、高程信息的三维索引,目前仅用于为「点」对象构建三维索引

属性索引

适应于根据其他属性查询的场景

建立索引的步骤

建立索引过程中,主要包含两个步骤:

  1. 定义空间/时空数据类型,即SimpleFeatureType
    1. 类型schema名称,可以认为是索引表的别名
    2. schema具体内容,包含了属性,空间对象(Geometry)以及时间等列的定义
    3. 其他自定义信息,包括:
      1. 使用的压缩方式
      2. 是否使用TWKB格式
      3. 为某一列建立索引
  2. 根据定义好的空间/时空数据类型创建具体的对象

注:可参考「快速入门」代码示例中的Write类,该类已经对上述操作进行了封装,方便使用

创建索引示例

如前所述,Ganos的索引可以同时存在,也可以根据需求只创建某个索引(如业务场景中只有周边范围查询,那么就只需要创建Z2索引,而不用创建其他索引)。默认情况下是建立所有的索引,这样对所有的查询场景来说都能提供较高的性能,但会占用较多的存储空间。为了节省空间存储,可以根据查询场景选择合适的索引。Ganos内置了特定的Hints,用来在定义SimpleFeatureType的时候指定对应的索引,语法如下:

//sft为SimpleFeatureType的一个实例对象
sft.getUserData().put("geomesa.indices.enabled", "{index_name}:{col1}:{col2}:...,{index_name}:{col}");
			
  • index_name取下面常量之一:id,attr,z2,z3,xz2,xz3,xyz
  • col为SimpleFeatureType中定义的列
  • 可以创建多个index,每个index之间用「,」分割;
  • 可以将多个列添加到同一个索引中,索引和每个列之间用「:」分割

下面这个示例中,一共创建了z3和attr两个索引,其中start列+dtg列为z3索引;end列+dtg列为z3索引;name列和dtg列为attr索引。

sft.getUserData().put("geomesa.indices.enabled", "z3:start:dtg,z3:end:dtg,attr:name:dtg");