geohash演算法將二維經緯度座標直接轉換成字串,每乙個字串代表乙個矩形區域,也就是說,這個矩形區域內所有的點(經緯度座標)都共享相同的geohash字串,字串的長度越大,矩形的區域就越小,經度也就越高。字串相似的表示距離相近,這樣可以利用字串的字首匹配來查詢附近的poi資訊。
地球緯度區間是[-90,90],經度區間是[-180,180],通過區間法對經度和緯度分別進行計算,假如我們獲取到的當前座標為經度-0.12866, 緯度38.534413,以緯度為例:
關於base32編碼:
編碼會去掉兩種情況:
(1)母音,去除母音防止密碼洩露,增加可靠性。如:hello world -> hll wrld
(2)容易混淆的字元,如:[1, i(大寫i), l(小寫l)],[0,o]
base32解碼:
geohash演算法利用base32將全球劃分成32個大的區域塊。
hash值轉換成經緯度:
字串越長,表示的範圍越精確。5位的編碼能表示10平方千公尺範圍的矩形區域,而6位編碼能表示更精細的區域(約0.34平方千公尺)。
a)在緯度相等的情況下:
經度每隔0.00001度,距離相差約1公尺;
每隔0.0001度,距離相差約10公尺;
每隔0.001度,距離相差約100公尺;
每隔0.01度,距離相差約1000公尺;
每隔0.1度,距離相差約10000公尺。
b)在經度相等的情況下:
緯度每隔0.00001度,距離相差約1.1公尺;
每隔0.0001度,距離相差約11公尺;
每隔0.001度,距離相差約111公尺;
每隔0.01度,距離相差約1113公尺;
每隔0.1度,距離相差約11132公尺。
其他base64編碼.
我們將二進位制編碼的結果填寫到空間中,當將空間劃分為四塊時候,編碼的順序分別是左下角00,左上角01,右下腳10,右上角11,也就是類似於z的曲線,當我們遞迴的將各個塊分解成更小的子塊時,編碼的順序是自相似的(分形),每乙個子快也形成z曲線,這種型別的曲線被稱為peano空間填充曲線。
這種型別的空間填充曲線的優點是將二維空間轉換成一維曲線(事實上是分形維),對大部分而言,編碼相似的距離也相近, 但peano空間填充曲線最大的缺點就是突變性,有些編碼相鄰但距離卻相差很遠,比如0111與1000,編碼是相鄰的,但距離相差很大。
在上圖中查詢a點附近的點時,由於a點和c點是在同乙個區域內,根據geohash演算法認為a點附近只有c點,沒有b點。但是實際上b點離a點甚至要比c點還要近,為了取得更精確的結果,除了目標點的geohash值外,還需要使用a點周圍8個區域值的geohash值。
參考:base32;
geohash;
geohash演算法獲取附近店鋪和距離;
geohash核心原理解析;
geohash的應用 附近位址搜尋
url 簡單使用 geohash,redis,bottle,python geohash 來實現 restful api的地理位置附近人搜素 依賴的redis封裝class import redis class redis object pool none r none def init self,...
基於GEOHASH演算法的附近點搜尋實現(一)
最近在參加學校的計算機 大賽,時間好像有點不夠,所以只完成了前面的一部分最基礎的功能,中途還是選擇了放棄。但是之前的部分的確覺得完成得還不錯,在這裡分享一下。題目是要完成乙個宇宙飛船加油點的分配排程系統。完成的部分是給定座標附近點的搜尋。我們要完成的乙個是二維附近點搜尋的演算法。就是在給出若干個加油...
利用GeoHash優化查詢附近門店功能
有乙個營銷砍價活動,當使用者報名完成後,需要選擇去領取活動商品的門店,可選的門店列表需要按照距離當前使用者經緯度最近的3家門店進行距離排序,假設候選門店有10000家門店。具體demo如下圖 2.1 思路 2.2 geohash實踐 2.2.1 活動繫結門店表增加geohash欄位 id 自增,bi...