`

geohash的原理实际是个四叉树/网格处理

阅读更多

看了下geohash的过程,原以为是一个新的索引过程,发现本质上是一个QuadTree。

不同点是,geohash仅保留了每一个四叉树节点的KEY,而不需要计算四叉树本身的索引。换句话说,如果我们建立一棵四叉树,建立过程如果为每一个节点都生产KEY,{00,01,10,11}表示4个节点。那么也就生产了一个geohash的KEY。

 

如同四叉树一样,

(0)每一个四叉树节点都是一个区域(网格),因此,geohash也是一个区域,四叉树的深度,对应geohash的精度。

(1)四叉树中访问当前节点的子节点是容易的,所以geohash可以通过KEY找到当前区域的子区域。

(2)四叉树访问一个节点的父节点是容易的,所以geohash也可以通过KEY的特点访问包含当前节点的区域的父节点区域。

(3)四叉树查询当前同一个父节点的另外3个兄弟节点是容易的,geohash可以找到其他3个相邻的区域。

(4)四叉树寻访<X,Y>中的周围一定区域的所有Items,是不容易的。同理,geohash要查找<X,Y>一个Items也是不容易的。

      因为在(2)中,只能容易访问当前节点的兄弟节点,而不是所有周边节点。

      四叉树一般是通过结合前面3条来逐层搜索。

 

geohash的优势:

个人觉得,对于不习惯建立四叉树索引、或者不手动写空间索引的人有优势外,如使用mysql或者其他数据库存储方便等。

 

顺便提下,大规模经纬度数据中的统计热点问题。

(0)如果是分布式,就用网格索引的KEY(可以看成是一个满四叉树的geohash的KEY),因为可以保证每台机器上不同数据,但都是同样的KEY结构。

(1)如果是单个文件,文件不太大就用四叉树索引;文件较大,用geohash;四叉树因为存储了大量的节点信息。如果还是太大,结合(0)方式,构建一个N*N叉树,每N*N个网格作为一组存放在一个文件中。

N一般选取,2,4,8

 

  • 结果图

先留个坑,过几天填上

 

  • 结论

无论使用什么样的hash方式,只要对二维或者多维数据进行hash算法,都不可避免的遇到邻接边问题。解决这个问题的办法,要么吧周边邻近的块搜索下,要么不用hash,而改用树。QuadTree是存储平面坐标点比较有效的办法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics