vlambda博客
学习文章列表

GeoHash算法学习讲解、解析及原理分析

当你在使用手机app查找附近的美食的时候,这些商家的信息是如何展示出来的,距离是如何计算出来的?空间计算是高CPU的操作,如果全部遍历一遍,那估计早炸了,这里比较通用的解法就是本文提到的 geohash。


geohash 把一个经纬度坐标处理成了一串字符串,具体的步骤有点类似于二分法。我们知道 lat 的取值范围是(-90,90),给定一个坐标点常营地铁站(lat:39.9257460000,lng:116.5998310000)。对其经度进行“二分”计算,最后可以得到一个二进制串101110001(精度越高,所表示区域范围越小)。同时对 lng 也做同样处理,最终将经纬度的二进制数进行组合,以奇数为纬度,偶数为经度组合。然后将获取到的经纬度二进制数以每5个数为一组,将每一组都进行转换成十进制数字。最后采用Base32对应编码进行转换可得到编码 wx4g0e。


geohash 其实是将整个地图或者某个分割所得的区域进行一次划分。由于奇数位代表纬度,偶数位代表经度。第一次划分时的 5bits 中3bits是表示经度,2bits表示纬度。那么相当于经度划分为了 8 个段,纬度划分成了 4 个段,一共是 32 个块。用同样的规则可以继续进行精度更高的划分。
geohash 将每一个区域划成一块块矩形块,每个矩形块使用一个字符串表示,当我们需要查询附近的点时,通过自己的坐标计算出一个字符串,根据这个字符串定位到我们所在的矩形块,然后返回这个矩形块中的点。这就是查找附近的XX的大致原理了。那么是不是就完美解决了呢?因为 geohash 代表的是一个矩形,处在矩形边上的位置在进行查询的时候反而无法匹配到其隔壁矩形中的点。一般做法是获取 geohash 周边的 8 个 hash 块同时进行查询。
总结:1. geohash 对二维的经纬度坐标进行了降维2. geohash 实际表示的是一个矩形区域,越长精度则越高3. 周边搜索时一般还会包含 geohash 周边的 8 个块4. 前缀相同的 geohash 位置一定相近吗?答:不一定。(参考 Peano 空间曲线)



点击左下角“阅读原文”。如有侵权,请联系删除

每日一篇前端文章导读。即使不读文章,也能窥得其中精华。