GeoMesa
一共有两大类索引,分别是普通属性索引、时空索引。
Geomesa
时空索引使用了基于Z-order
填充曲线的GeoHash空间索引技术,并对时间维度进行了扩展,共提供两类四种索引。其中2表示二维,即空间索引,3表示3维,即时空索引;Z表示点的索引,XZ表示线/面的索引。
(1) 空间索引(Z2和XZ2)
如果SimpleFeatureType有空间类型属性,如Point
、LineString
、Polygon
等,则GeoMesa
会为该空间属性创建空间索引。如果有多个空间属性,则选择默认的一个简历索引,即以*作为前缀的属性,通过SimpleFeatureType.getGeometryDescriptor
可以获取查看。
(2) 时空索引(Z3和XZ3)
如果SimpleFeatureType
同时有空间属性和时间属性,则GeoMesa会在这两个属性上创建时空索引,建立索引的时间属性是第一个声明的属性,或者被显示指定的属性。
GeoMesa
索引的基本原理是将三维(经度、纬度、时间)的数据按照Z曲线进行降维, 得到一维数据作为Key
使用,方便在key-value
数据库中进行查询。
一、 空间填充曲线Z曲线
1.1 R树索引
Oracle Spatial
、 Mysql Spatial PostgreSQL
都是基于R树进行空间搜索操作,对空间字段创建R树索引。但R树存在几点问题:
(1)R树索引需要单独创建一个索引文件
(2)当数据更新、新插入数据、删除数据时,为了平衡会更新整个R树
(3)不适合NoSQL
接口,Hbase
本身只提供基于rowKey
和全表扫描的查询,rowkey
索引单一,对于多维度的查询困难。
1.2 Z曲线
Z曲线具有下面两点优点:
(1)降维
(2)保持数据的locality
特性
普通的关系数据无法对多维数据直接进行查询,通过使用空间填充曲线对空间实体数据集进行降维处理,映射到一维空间进行编码,就可以重复利用已有的B树索引
、Hash索引
、Bitmap索引
等技术针对一维空间进行查询。
二、 GeoHash原理
GeoHash
是空间索引的一种方式,基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个字块在一定的经纬度范围内拥有相同的编码。以GeoHash
方式建立空间索引,可以提高对空间数据进行经纬度检索的效率。
GeoHash
将二维的经纬度进行二进制编码(逼近编码),之后将得到的二进制编码转换成字符串(Base32编码)。举例如下图所示。
● 字符串越长,表示的范围越小,空间位置越精确;字符串越短,表示的范围越大越宽泛;
● 字符串越相似表示距离空间越近。
三、 Geomesa Hbase索引
Z曲线上的每个点都可以赋予一个顺序值,通过这个顺序值,GeoMesa
将经纬度表示为一个整数,这样就将二维数据降为一维数据,可以作为key-value
数据库中的key
使用。因为Z曲线支持多维数据,所以GeoMesa
也支持将多维数据降为一维数据,作为key
使用。
GeoMesa Hbase
源码的类结构关系如下图所示。
GeoMesa HBase
构建索引主要是将空间和时间、属性等信息组织在rowkey
中,时空数据根据Z曲线降维之后的RowKey
设计如下:
Shard:空间数据的预分片,范围为1-127,默认为4。可以对数据schema
进行设置:
simpleFeatureType.getUserData().put(“geomesa.z.splits”, “4”);
Epoch Week: 时间索引的时间间隔,z-index time interval
,默认是week
。可以对数据schema
进行设置:
simpleFeatureType.getUserData().put(“geomesa.z3.interval”, “month”);
对于不同的索引类型有不同的rowkey
结构,具体情况如下表所示。
索引类型 | RowKey |
---|---|
Z2 | ShardKey(1 byte)+Z2(x,y)(2 bytes)+FeatureID |
Z3 | ShardKey(1 byte)+Epoch Week(2 bytes)+Z3(x,y,t)(8 bytes)+FeatureID |
XZ2 | ShardKey(1 byte)+XZ2(minX, minY, maxX, maxY)(8 bytes)+FeatureID |
XZ3 | ShardKey(1 byte)+Epoch Week(2 bytes)+XZ3(minX, minY, maxX, maxY)(8 bytes)+FeatureID |
Attribute | IndxBytes(2 bytes)+ShardKey(1 byte)+AttrValue+SplitByte(1 byte)+SecondaryIndex(Z3/XZ3/Z2/XZ2)+FeatureID |
FeatureID | FeatureID |
网友评论