前言
最近偶然间看到了 Geohash 算法,才想起来之前自己做过的附近的功能简直不堪一击,竟然是计算所有与目标点的距离,再排序。想必有经验的人早就笑出声了吧,按照以前的水平,如果不这样做,那也得找出比较相近的,先不计算球面距离,然后得到一个小一点的集合,再计算距离,这样计算量大大减小,然而还是要扫描所有点,那有没有办法不扫描整张表就能得到附近点的信息,想到这,我们而已给所有点预先做一个标签,我们每一次想找附近的点就去比较这些标签,如果我们能够保证,距离相近的点在一个标签内,那么我们就可以只取该标签的点,然后再做距离计算,这样就不用扫描整张表了,问题到这,基本已经浮出水面,接下来就是最核心的问题,如何将点的信息映射成标签,这便是 Geohash https://en.wikipedia.org/wiki/Geohash wiki 上有所解释,但不是那么易懂,可以看看这位仁兄的博客,GeoHash核心原理解析 讲解清晰易懂
相似度
Geohash 将经纬度映射成一段字符串,越是相近的点,前缀匹配就越长,每一位都会有一个精度问题,匹配的越长距离就越近,当然也存在误差
利用这个来做附近的点选取再合适不过了。
Haversine 计算球面距离
传统的计算球面距离公式计算量大,当我们没有要求很高的精度的时候,可以适当通过别的更简单的计算公式得到近似的结果,这便是 Haversine 发挥的作用