老衛帶你學 Geohash演算法原理及實現

2021-10-06 05:58:28 字數 1750 閱讀 7230

geohash演算法就是將經緯度編碼,將二維變一維,給位址位置分割槽的一種演算法。

基本原理

geohash是一種位址編碼方法。他能夠把二維的空間經緯度資料編碼成乙個字串

我們知道,經度範圍是東經180到西經180,緯度範圍是南緯90到北緯90,我們設定西經為負,南緯為負,所以地球上的經度範圍就是[-180, 180],緯度範圍就是[-90,90]。如果以本初子午線、赤道為界,地球可以分成4個部分。

如果緯度範圍[-90°, 0°)用二進位制0代表,(0°, 90°]用二進位制1代表,經度範圍[-180°, 0°)用二進位制0代表,(0°, 180°]用二進位制1代表,那麼地球可以分成如下4個部分

如果在小塊範圍內遞迴對半劃分呢?

可以看到,劃分的區域更多了,也更精確了。geohash演算法就是基於這種思想,劃分的次數更多,區域更多,區域面積更小了。通過將經緯度編碼,給地理位置分割槽

geohash演算法

geohash演算法一共有三步。

首先將經緯度變成二進位制。

比如這樣乙個點(39.923201, 116.390705)

緯度的範圍是(-90,90),其中間值為0。對於緯度39.923201,在區間(0,90)中,因此得到乙個1;(0,90)區間的中間值為45度,緯度39.923201小於45,因此得到乙個0,依次計算下去,即可得到緯度的二進位制表示,如下表:

最後得到緯度的二進位制表示為:

10111000110001111001
同理可以得到經度116.390705的二進位制表示為:

11010010110001000100
第2步,就是將經緯度合併。經度佔偶數字,緯度佔奇數字,注意,0也是偶數字。

11100

11101

00100

01111

00000

01101

01011

00001

第3步,按照base32進行編碼base32編碼表的其中一種如下,是用0-9、b-z(去掉a, i, l, o)這32個字母進行編碼。具體操作是先將上一步得到的合併後二進位制轉換為10進製資料,然後對應生成base32碼。需要注意的是,將5個二進位制位轉換成乙個base32碼。上例最終得到的值為

wx4g0ec1
geohash用乙個字串表示經度和緯度兩個座標。在資料庫中可以實現在一列上應用索引(某些情況下無法在兩列上同時應用索引)

問題geohash演算法有兩個問題。首先是邊緣問題。

如圖,如果車在紅點位置,區域內還有乙個黃點。相鄰區域內的綠點明顯離紅點更近。但因為黃點的編碼和紅點一樣,最終找到的將是黃點。這就有問題了。

要解決這個問題,很簡單,只要再查詢周邊8個區域內的點,看哪個離自己更近即可。

另外就是曲線突變問題。

老衛帶你學 numpy集合運算

集合運算 2018 11 11 1.np.unique 唯一值 它用幹找出陣列中的唯一值並返回已排序的結果 names np.array bob joe will bob np.unique names array bob will bob joe dtype sorted set names 等價...

老衛帶你學 python裝飾器

python的裝飾器,就是在不修改原有 的基礎上,增加額外的功能 假如我們原有乙個函式,這個函式它的功能是尋找1 n範圍內的偶數 def func for i in range 1000 if i 2 0 print i r func 此時列印如下 988990 992994 996998.那如果我...

老衛帶你學 PYTHON之WITH語句原理

我們看乙個with處理檔案操作的例項 with open etc passwd as f for line in f print line 這段 的作用 開啟乙個檔案,如果一切正常,把檔案物件賦值給f,然後用迭代器遍歷檔案中每一行,當完成時,關閉檔案 而無論在這段 的任何地方,如果發生異常,此時檔案...