看了下geohash的過程,原以為是一個新的索引過程,發現本質上是一個QuadTree。
不同點是,geohash僅保留了每一個四叉樹節點的KEY,而不需要計算四叉樹本身的索引。換句話說,如果我們建立一棵四叉樹,建立過程如果為每一個節點都生産KEY,{00,01,10,11}表示4個節點。那麼也就生産了一個geohash的KEY。
如同四叉樹一樣,
(0)每一個四叉樹節點都是一個區域(網格),是以,geohash也是一個區域,四叉樹的深度,對應geohash的精度。
(1)四叉樹中通路目前節點的子節點是容易的,是以geohash可以通過KEY找到目前區域的子區域。
(2)四叉樹通路一個節點的父節點是容易的,是以geohash也可以通過KEY的特點通路包含目前節點的區域的父節點區域。
(3)四叉樹查詢目前同一個父節點的另外3個兄弟節點是容易的,geohash可以找到其他3個相鄰的區域。
(4)四叉樹尋訪<X,Y>中的周圍一定區域的所有Items,是不容易的。同理,geohash要查找<X,Y>一個Items也是不容易的。
因為在(2)中,隻能容易通路目前節點的兄弟節點,而不是所有周邊節點。
四叉樹一般是通過結合前面3條來逐層搜尋。
geohash的優勢:
個人覺得,對于不習慣建立四叉樹索引、或者不手動寫空間索引的人有優勢外,如使用mysql或者其他資料庫存儲友善等。
順便提下,大規模經緯度資料中的統計熱點問題。
(0)如果是分布式,就用網格索引的KEY(可以看成是一個滿四叉樹的geohash的KEY),因為可以保證每台機器上不同資料,但都是同樣的KEY結構。
(1)如果是單個檔案,檔案不太大就用四叉樹索引;檔案較大,用geohash;四叉樹因為存儲了大量的節點資訊。如果還是太大,結合(0)方式,建構一個N*N叉樹,每N*N個網格作為一組存放在一個檔案中。
N一般選取,2,4,8
- 結果圖
先留個坑,過幾天填上
- 結論
無論使用什麼樣的hash方式,隻要對二維或者多元資料進行hash算法,都不可避免的遇到鄰接邊問題。解決這個問題的辦法,要麼吧周邊鄰近的塊搜尋下,要麼不用hash,而改用樹。QuadTree是存儲平面坐标點比較有效的辦法。