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. 其他自定义信息,包括:

      a.使用的压缩方式。

      b.是否使用TWKB格式。

      c.为某一列建立索引。

  2. 根据定义好的空间/时空数据类型创建具体的对象。

创建索引示例

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");