GeoHash簡介

現在很多APP都有搜索附近的功能,比如附近的人、附近的店鋪等。要實現這樣的功能,我們可以用最笨的方法:根據經緯度計算距離,然後劃定一個閾值,只要小於該閾值就算是附近的。這種方法在數據量小時基本沒問題,但是,如果數據量特別大,那服務器就需要進行大量的計算,負擔很重!爲了解決這一類問題,一個比較常用的方法就是利用GeoHash。
一、簡介
GeoHash是一種地址編碼方法。他能夠把二維的空間經緯度數據編碼成一個字符串。GeoHash具有以下特點:
1、GeoHash用一個字符串表示經度和緯度兩個座標。在數據庫中可以實現在一列上應用索引
2、GeoHash表示的並不是一個點,而是一個區域;
3、GeoHash編碼的前綴可以表示更大的區域。例如wx4g0ec1,它的前綴wx4g0e表示包含編碼wx4g0ec1在內的更大範圍。 這個特性可以用於附近地點搜索
二、計算方法:
GeoHash的計算過程分爲三步:
1、將經緯度轉換成二進制:
比如這樣一個點(39.923201, 116.390705)
緯度的範圍是(-90,90),其中間值爲0。對於緯度39.923201,在區間(0,90)中,因此得到一個1;(0,90)區間的中間值爲45度,緯度39.923201小於45,因此得到一個0,依次計算下去,即可得到緯度的二進制表示,如下表:
這裏寫圖片描述
最後得到緯度的二進制表示爲:
10111000110001111001
同理可以得到經度116.390705的二進制表示爲:
11010010110001000100
2、合併緯度、經度的二進制:
合併方法是將經度、緯度二進制按照奇偶位合併:
11100 11101 00100 01111 00000 01101 01011 00001
3、按照Base32進行編碼:
Base32編碼表(其中一種):
這裏寫圖片描述
將上述合併後二進制編碼後結果爲:
wx4g0ec1
三、GeoHash的精度
這裏寫圖片描述
編碼越長,表示的範圍越小,位置也越精確。因此我們就可以通過比較GeoHash匹配的位數來判斷兩個點之間的大概距離。
四、不足之處及解決方法
1、邊緣附近的點,黃色的點要比黑色的點更加靠近紅點,但是由於黑點跟紅點的GeoHash前綴匹配數目更多,因此得到黑點更加靠近紅點的結果
這裏寫圖片描述
解決方法:
可以通過篩選周圍8個區域內的所有點,然後計算距離得到滿足條件結果。
2、因爲現有的GeoHash算法使用的是Peano空間填充曲線(可感興趣的可自己查看),這種曲線會產生突變,造成了編碼雖然相似但距離可能相差很大的問題,因此在查詢附近的時候,首先篩選GeoHash編碼相似的點,然後進行實際距離計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章