前言
最近偶然間看到了 Geohash 算法,才想起來之前自己做過的附近的功能簡直不堪一擊,竟然是計算所有與目標點的距離,再排序。想必有經驗的人早就笑出聲了吧,按照以前的水平,如果不這樣做,那也得找出比較相近的,先不計算球面距離,然后得到一個小一點的集合,再計算距離,這樣計算量大大減小,然而還是要掃描所有點,那有沒有辦法不掃描整張表就能得到附近點的信息,想到這,我們而已給所有點預先做一個標簽,我們每一次想找附近的點就去比較這些標簽,如果我們能夠保證,距離相近的點在一個標簽內,那么我們就可以只取該標簽的點,然后再做距離計算,這樣就不用掃描整張表了,問題到這,基本已經浮出水面,接下來就是最核心的問題,如何將點的信息映射成標簽,這便是 Geohash https://en.wikipedia.org/wiki/Geohash wiki 上有所解釋,但不是那么易懂,可以看看這位仁兄的博客,GeoHash核心原理解析 講解清晰易懂
相似度
Geohash 將經緯度映射成一段字符串,越是相近的點,前綴匹配就越長,每一位都會有一個精度問題,匹配的越長距離就越近,當然也存在誤差

Screenshot from 2018-09-06 09-10-02.png
利用這個來做附近的點選取再合適不過了。
Haversine 計算球面距離
傳統(tǒng)的計算球面距離公式計算量大,當我們沒有要求很高的精度的時候,可以適當通過別的更簡單的計算公式得到近似的結果,這便是 Haversine 發(fā)揮的作用