空间数据库系列二:空间索引S2与Z3分析对比
S2与Z3对比分析
1.S2
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的数值。
S2共30级,范围:
2.geohash
Geohash 是一种地理编码,它是一种分级的数据结构,分为12级,把空间划分为网格。Geohash属于二维空间填充曲线中的Z阶曲线的实际应用。
表示范围如下:
3.Geomesa Z3
Z3是geomesa提供的基于三维Z阶填充曲线的索引编码,对经纬度+时间进行编码。所以空间处理上与geohash具有形同特点。
4.S2对比geohash
目前大数据领域处理时空数据的方式是,通过geohash/S2对用户空间或轨迹数据降维为一维字符串,存储到DB(例如hbase)系统里面。查询时,根据给出的范围(用BBOX,DISTANCE表示)等,在geohash/S2上映射出满足对应精度及范围的一组一维range(每组range表示满足条件的cell)。通过这些一维数据的前缀邻近性原则在DB的key上搜索满足条件的解码后二次过滤。
4.1 geohash存在的问题
geohash邻近点查询是先查找点所在的单元,然后根据所在的单元查询相同level相邻的8个单元,这就意味着需要在我们的DB(Hbase)中查询9个cell范围内的数据,来过滤出来进步二次查询。网格大小选择不好,会引入较大查询。
例如:查询离红星最近点,如果Geohash 字符串为6的话,就是蓝色的大格子。紫色的圆点是搜索出来的目标点。如果用 Geohash 算法查询的话,距离比较近的可能是 wtw37p,wtw37r,wtw37w,wtw37m。但是其实距离最近的点就在 wtw37q。如果选择这么大的网格,就需要再查找周围的8个格子。
如果选择 Geohash 字符串为7的话,那变成黄色的小格子。这样距离红星星最近的点就只有一个了
geohash是按照1-12级把空间划分成cell,不同级别的cell范围从5000KM到3.7cm。不同级别间跳变很大。比如选择字符串长度为4,它对应的 cell 宽度是39.1km,需求可能是50km,那么选择字符串长度为3,对应的 cell 宽度就变成了156km,瞬间又大了3倍了。实际中选择合适的level比较困难。
geohash范围覆盖时,同样存在level选择上问题,可能用较大的cell覆盖查询范围。
Z曲线突变性,会导致某些编码相近但是实际距离很远的情况。
4.2.S2优势
S2 有30级,表示范围从0.7cm² 到 85,000,000km²,中间变化平缓。
S2主要优势是他的范围覆盖算法。给定一个查询范围以及期望返回的最多网格数,S2就可以返回覆盖查询区域不同等级level的cell,每个cell对应在DB(HBASE)中查询的范围。S2的返回很精确,会减少从DB的读取数据量。
功能上:S2提供了较丰富的查询函数。很容易实现distance,多边形范围查询等,以及各种计算面积,距离等处理。参考这里S2 doc
4.3.实际对比例子
采用矩形覆盖巴黎,level 5 9个cell不能覆盖巴黎左边区域,可以增加3个cell,总计12个cell:
大部分算法,采用level 4,9个cell覆盖巴黎,如下:
采用S2算法,9个cell覆盖巴黎与geohash对比如下:
5.测试
在TSDB上实现S2索引存储到Hbase。hbase rowkey格式类似:shard(2B)+days(2B)+z3/S2(8B)+point(4B+4B)+time(8B)+objid
分别对比了S2和Z3,在两个数据集上的表现
- 2400W geo_life
数据说明: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 |
- 100W轨迹数据
数据说明:从[-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条) |
参考
1. geohash在线验证
2. 高效的多维空间点索引算法 — Geohash 和 Google S2
空间数据库系列二:空间索引S2与Z3分析对比的更多相关文章
- keystone系列二:keystone源码分析
六 keystone架构 6.1 Keystone API Keystone API与Openstack其他服务的API类似,也是基于ReSTFul HTTP实现的. Keystone API划分为A ...
- SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础
原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...
- 爬虫系列(二) Chrome抓包分析
在这篇文章中,我们将尝试使用直观的网页分析工具(Chrome 开发者工具)对网页进行抓包分析,更加深入的了解网络爬虫的本质与内涵 1.测试环境 浏览器:Chrome 浏览器 浏览器版本:67.0.33 ...
- SonarQube系列二、分析dotnet core/C#代码
[前言] 本系列主要讲述sonarqube的安装部署以及如何集成jenkins自动化分析.netcore项目.目录如下: SonarQube系列一.Linux安装与部署 SonarQube系列二.分析 ...
- Web 前端开发人员和设计师必读精华文章【系列二十六】
<Web 前端开发精华文章推荐>2014年第5期(总第26期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】
<Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- WPF入门教程系列(二) 深入剖析WPF Binding的使用方法
WPF入门教程系列(二) 深入剖析WPF Binding的使用方法 同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProp ...
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...
随机推荐
- Java 多线程 三种实现方式
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- HSF原理
HSF(High-speed Service Framework),高速服务框架,是阿里系主要采用的服务框架,其目的是作为桥梁联通不同的业务系统,解耦系统之间的实现依赖.其高速体现在底层的非阻塞I/O ...
- input 元素 相对父元素错位
<div class="recommend"> <i class="iconfont icon-user"></i> < ...
- 【.Net】在C#中判断某个类是否实现了某个接口
有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候. 简单来说,可以使用Type.IsAssignableFrom方法: t ...
- CSS-posiziton
1. 想要实现,”返回顶部”永远位于页面的右下角.需要用到position函数.CSS:层叠样式表.用到了分层的功能. position:fixed; 永远固定在一个地方. <!DOCTYPE ...
- html的body内标签之input系列1
1. Form的作用:提交当前的表单. 类似于去了银行提交的纸质单子,递到后台去办理相关业务. text,password只有输入的功能:button,submit只有点击的功能.想要把这些信息提交, ...
- [51nod1325]两棵树的问题
description 题面 solution 点分治+最小割. 点分必选的重心,再在树上dfs判交,转化为最大权闭合子图. 可以做\(k\)棵树的情况. code #include<iostr ...
- spring+springMVC+mybatis较全
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On- ...
- 【BZOJ5329】【SDOI2018】战略游戏(圆方树,虚树)
[BZOJ5329][SDOI2018]战略游戏(圆方树,虚树) 题面 BZOJ 洛谷 Description 省选临近,放飞自我的小Q无心刷题,于是怂恿小C和他一起颓废,玩起了一款战略游戏. 这款战 ...
- POJ1061:青蛙的约会——题解
http://poj.org/problem?id=1061 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定 ...