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是存储平面坐标点比较有效的办法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值