Google S2 被用在Google Map、MongoDB、Foursquare上,用来解决多维空间点索引的问题的。S2主要是把三维空间数据降维为一维UINT64表示的数据。球面上的点S(lat,lng) -> f(x,y,z) -> g(face,u,v) -> h(face,s,t)->cellid(uint64)。球面经纬度坐标转换成球面xyz坐标,再转换成外切正方体投影面上的坐标,再变换成修正后的坐标h(face,s,t),最后经过希尔伯特曲线变换为64bit的数值。git
S2共30级,范围:github
Geohash 是一种地理编码,它是一种分级的数据结构,分为12级,把空间划分为网格。Geohash属于二维空间填充曲线中的Z阶曲线的实际应用。算法
表示范围以下:数据结构
Z3是geomesa提供的基于三维Z阶填充曲线的索引编码,对经纬度+时间进行编码。因此空间处理上与geohash具备形同特色。函数
目前大数据领域处理时空数据的方式是,经过geohash/S2对用户空间或轨迹数据降维为一维字符串,存储到DB(例如hbase)系统里面。查询时,根据给出的范围(用BBOX,DISTANCE表示)等,在geohash/S2上映射出知足对应精度及范围的一组一维range(每组range表示知足条件的cell)。经过这些一维数据的前缀邻近性原则在DB的key上搜索知足条件的解码后二次过滤。测试
geohash邻近点查询是先查找点所在的单元,而后根据所在的单元查询相同level相邻的8个单元,这就意味着须要在咱们的DB(Hbase)中查询9个cell范围内的数据,来过滤出来进步二次查询。网格大小选择很差,会引入较大查询。大数据
例如:查询离红星最近点,若是Geohash 字符串为6的话,就是蓝色的大格子。紫色的圆点是搜索出来的目标点。若是用 Geohash 算法查询的话,距离比较近的多是 wtw37p,wtw37r,wtw37w,wtw37m。可是其实距离最近的点就在 wtw37q。若是选择这么大的网格,就须要再查找周围的8个格子。ui
若是选择 Geohash 字符串为7的话,那变成黄色的小格子。这样距离红星星最近的点就只有一个了编码
geohash是按照1-12级把空间划分红cell,不一样级别的cell范围从5000KM到3.7cm。不一样级别间跳变很大。好比选择字符串长度为4,它对应的 cell 宽度是39.1km,需求多是50km,那么选择字符串长度为3,对应的 cell 宽度就变成了156km,瞬间又大了3倍了。实际中选择合适的level比较困难。spa
geohash范围覆盖时,一样存在level选择上问题,可能用较大的cell覆盖查询范围。
Z曲线突变性,会致使某些编码相近可是实际距离很远的状况。
S2 有30级,表示范围从0.7cm² 到 85,000,000km²,中间变化平缓。
S2主要优点是他的范围覆盖算法。给定一个查询范围以及指望返回的最多网格数,S2就能够返回覆盖查询区域不一样等级level的cell,每一个cell对应在DB(HBASE)中查询的范围。S2的返回很精确,会减小从DB的读取数据量。
功能上:S2提供了较丰富的查询函数。很容易实现distance,多边形范围查询等,以及各类计算面积,距离等处理。参考这里S2 doc
采用矩形覆盖巴黎,level 5 9个cell不能覆盖巴黎左边区域,能够增长3个cell,总计12个cell:
大部分算法,采用level 4,9个cell覆盖巴黎,以下:
采用S2算法,9个cell覆盖巴黎与geohash对好比下:
在TSDB上实现S2索引存储到Hbase。hbase rowkey格式相似:shard(2B)+days(2B)+z3/S2(8B)+point(4B+4B)+time(8B)+objid
分别对比了S2和Z3,在两个数据集上的表现
数听说明:182我的三年的GPS活动轨迹。 查询:BBOX[100.21831, 30.0, 127.21831,80.136253] time:[2007-08-04 11:30:32, 2007-08-13 16:32:52] 真实命中11条数据。
数据Z3编码耗时 | Z3 BBOX 查询 | 数据S2编码耗时 | S2 BBOX 查询 |
---|---|---|---|
518ms | Z3索引命中hbase:15309条数据,查询耗时1461ms | 1318ms | S2索引命中hbase:15310条,查询耗时877ms |
数听说明:从[-30,-20]移动到[-20,-10],每秒经纬度移动0.00001,每秒位置记录;特色数据密度大。 查询:BBOX[-25.50, -18.60, -20.00,-15.40] time:[2018-07-14 01:58:15,2018-07-19 20:51:35] 真实命中:10001条数据
100W数据Z3编码耗时 | Z3 BBOX 查询 | 100W数据S2编码耗时 | S2 BBOX 查询 |
---|---|---|---|
1185ms | 查询耗时2975ms (Z3索引命中hbase:211400条数据) | 518ms | 查询耗时375ms (S2索引命中hbase:60969条) |