【每天推薦一篇文章】Geohash
前幾天我們有介紹過把地圖切成很多小方格的三詞地址,昨天跟朋友吃飯的時候想起另一個同樣切小方格的做法,決定今天就來轉貼這篇;
要認識 Geohash,可以先從第二篇文章中的這一段開始:
app 介面上會顯示出自己附近一個範圍內可用的計程車或者共享單車。假設地圖上會顯示以自己為圓心,5公里為半徑,這個範圍內的車。如何實現呢?
最直觀的想法就是去資料庫裡面查表,計算並查詢車距離使用者小於等於5公里的,篩選出來,把數據返回給用戶端。
這種做法比較笨,一般也不會這麼做。為什麼呢?因為這種做法需要對整個表裡面的每一項都計算一次相對距離。太耗時了。
現在用的比較多的資料庫 MySQL、PostgreSQL 都原生支援 B+ 樹。 這種數據結構能高效的查詢。地圖分塊的過程其實就是一種添加索引的過程,如果能想到一個辦法,把地圖上的點添加一個合適的索引,並且能夠排序,那麼就可以利用類似二分查找的方法進行快速查詢。
問題就來了,地圖上的點是二維的,有經度和緯度,這如何索引呢?
Geohash 同樣是把地圖切成多個小方格,但同時也有精度的概念。該區塊的索引長度越長,指定的區域也就越小
例如說 AAA 這個區塊在 AAB 旁邊,而 AAA 的這個方格又可以往下切分成 AAAA 和 AAAB。然後 AAAA 再繼續拆成 AAAAA…
同時因為編碼是用 Z 字形排列下去的,像是
AA AB
AC AD…
所以編碼相近的位置也會相近,也就可以用來判斷兩點距離
我們可以拿這兩個點的 Hash 檢查前幾碼是不是一致,來判斷兩點是不是同一個區塊內、又是大概多少精度的時候不在同一區
如果需要範圍大一點、模糊一點,也可以直接限制字串長度。如此一來就可以藉由這些切好的地圖區塊快速查詢附近的點和區域了
那麼,今天的轉貼就到這邊。我們明天見~
其他文章
哈囉,如果你也有 LikeCoin,也覺得我的文章有幫上忙的話,還請不吝給我拍拍手呦,謝謝~ ;)