使用geohash的幾個要點

geohash是什麼?怎麼生成?

  1. geohash採用的是base32編碼.即Geohash中的每一個字母或者數字(如wx4g0e中的w)都是由5bits組成(2^5 = 32,base32),這5bits可以有32中不同的組合(0~31),這樣我們可以將整個地圖區域分爲32個區域,通過00000 ~ 11111來標識這32個區域。
    在這裏插入圖片描述
    在這裏插入圖片描述
  2. Geohash的0、1串序列是經度0、1序列和緯度0、1序列中的數字交替進行排列的,偶數位對應的序列爲經度序列,奇數位對應的序列爲緯度序列(這裏應該是從0開始排列,也就是第一位是經度,下標爲0)。在進行第一次劃分時,Geohash0、1序列中的前5個bits(11100),那麼這5bits中有3bits是表示經度,2bits表示緯度,所以第一次劃分時,是將經度劃分成8個區段(2^3 = 8),將緯度劃分爲4個區段(2^2 = 4),這樣就形成了32個區域。所以上圖中橫向8個格子,縱向4個格子,一共32個格子。
    在這裏插入圖片描述
  3. 同樣的,對於第二位geohash是在第一位geohash劃分的格子的基礎上再重新劃分。同樣的,第二位geohash也是代表的5位,不同的是第二位geohash是從第5位開始(下標從0開始)。也就是代表3位是緯度,2位是經度。

緯度
在這裏插入圖片描述
經度
在這裏插入圖片描述
第二位geohash編碼
在這裏插入圖片描述

在這裏插入圖片描述

geohash的填充曲線是唯一的——Peano空間填充曲線

網上爲了介紹geohash的填充曲線,會介紹填充曲線的由來,並且會提到幾種不同的填充曲線,如下圖:
在這裏插入圖片描述
但是要明確的是,按照geohash的編碼規則,填充曲線是唯一的
在這裏插入圖片描述
在這裏插入圖片描述

geohash的長度,位數和空間精度

geohash有一個三者的對照表:
在這裏插入圖片描述
不同長度的geohash格子對應的長和寬對照表
在這裏插入圖片描述
有兩種方法指定geohash精度

  • 一個是指定geohash碼的長度。這種編碼精度控制方式理解起來簡單。對於經度,其各個geohash字符代表的編碼位數依次是:3,2,3,2 ……。所以我們看上面的長,寬表。不同位數的geohash的寬度依次是:50009.4,1252.3,156.5……其前後倍數之間的關係依次是:4,8,4,8,4……。對於維度而言類似。

    python的包Geohash就是採用的這種方式:

import Geohash as gs
print(gs.encode(39.928167, 116.389550, 1))
print(gs.encode(39.928167, 116.389550, 2))

#輸出
w
wx
  • 第二種精度控制方式就是0,1碼的位數。如果精度位數是1-5 可以生成1位geohash碼,6-10 可以生成2位geohash碼。以此類推。這就產生一個問題:在geohash位數一樣的情況下(例如geohash碼長度爲2),對於同一個座標點,不同精度對應的geohash是一樣的嗎?換句話說,對於同一個點,採用6位精度和10位精度生成的geohash碼一樣嗎?
import org.locationtech.geomesa.utils.geohash.GeoHash;

public class HashTest {
    public static void main(String[] args) {
        System.out.println(GeoHash.apply(116.389550, 39.928167, 6).hash());
        System.out.println(GeoHash.apply(116.389550, 39.928167, 7).hash());
        System.out.println(GeoHash.apply(116.389550, 39.928167, 8).hash());
        System.out.println(GeoHash.apply(116.389550, 39.928167, 9).hash());
        System.out.println(GeoHash.apply(116.389550, 39.928167, 10).hash());
        /*
        輸出
        wh
        ws
        ww
        ww
        wx
        * */
    }
}

由上面的輸出看出,完全不一樣。也就是同一個座標點,對於可能對應長度相同但內容不同的geohash碼,但是,不同的geohash的前綴是相同的。所以實際使用過程中geohash長度要比預期設置要大一位。比如要使用2位geohash,那就把精度設爲11-15.這樣會生成3位geohash.然後把尾部一位截去。

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