Redis新特性GEOHASH

一、簡言

    Redis 的 GEO 特性將在 Redis 3.2 版本釋出, 這個功能可以將用戶給定的地理位置信息儲存起來, 並對這些信息進行操作   

    將指定的地理空間項目(緯度,經度,名稱)添加到指定的鍵。數據作爲排序集存儲到密鑰中,使得可以使用GEORADIUS或GEORADIUSBYMEMBER命令使用半徑查詢稍後檢索項目。

    該命令採用標準格式x,y的參數,因此必須在緯度之前指定經度。可以索引的座標有限制:非常靠近極點的區域不可索引。如EPSG:900913 / EPSG:3785 / OSGEO:41001規定的具體限值如下:

    有效經度爲-180至180度。

    有效緯度爲-85.05112878至85.05112878度。

    注意:沒有GEODEL命令,可以使用ZREM來刪除元素。地理索引結構只是一個排序集。

二、Redis GEO實現

    Redis GEO實現主要包含了以下兩項技術:

    1、使用geohash保存地理位置的座標。

    2、使用有序集合(zset)保存地理位置的集合。


三、GEOHASH

    geohash的思想是將二維的經緯度轉換成一維的字符串,geohash有以下三個特點:

1、字符串越長,表示的範圍越精確。編碼長度爲8時,精度在19米左右,而當編碼長度爲9時,精度在2米左右。

2、字符串相似的表示距離相近,利用字符串的前綴匹配,可以查詢附近的地理位置。這樣就實現了快速查詢某個座標附近的地理位置。

3、geohash計算的字符串,可以反向解碼出原來的經緯度。


四、GEOHASH命令語法

    1、geoadd 用來增加地理位置的座標,可以批量添加地理位置,其格式爲:

        GEOADD key longitude latitude member [longitude latitude member ...]

        字段的介紹:

        key標識一個地理位置的集合。longitude latitude member標識了一個地理位置的座標。longitude是地理位置的經度,latitude是地理位置的緯度。

        member是該地理位置的名稱。GEOADD可以批量給集合添加一批地理位置

        egg:GEOADD beijing-area 39.8865577059 116.2161254883 shijingshan

    2、geopos 可以獲取地理位置的座標,可以批量獲取多個地理位置的座標,命令格式爲:

        GEOPOS key member [member ...]


    3、geodist 用來獲取兩個地理位置的距離,命令格式爲:

        單位可以指定爲以下四種類型:

        m:米,距離單位默認爲米,不傳遞該參數則單位爲米。

        km:公里。

        mi:英里。

        ft:英尺。

    4、georadius 可以根據給定地理位置座標獲取指定範圍內的地理位置集合。命令格式爲:

         GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

        longitude latitude標識了地理位置的座標,radius表示範圍距離,距離單位可以爲m|km|ft|mi,還有一些可選參數:

WITHCOORD:傳入WITHCOORD參數,則返回結果會帶上匹配位置的經緯度。

WITHDIST:傳入WITHDIST參數,則返回結果會帶上匹配位置與給定地理位置的距離。

ASC|DESC:默認結果是未排序的,傳入ASC爲從近到遠排序,傳入DESC爲從遠到近排序。

WITHHASH:傳入WITHHASH參數,則返回結果會帶上匹配位置的hash值。

COUNT count:傳入COUNT參數,可以返回指定數量的結果。

    5、georadiusbymember  可以根據給定地理位置獲取指定範圍內的地理位置集合。georadius命令傳遞的是座標,georadiusbymember傳遞的是地理位置。georadius更爲靈活,

可以獲取任何座標點範圍內的地理位置。但是大多數時候,只是想獲取某個地理位置附近的其他地理位置,使用georadiusbymember則更爲方便。

        georadiusbymember命令格式爲(命令可選參數與georadius含義一樣):

          georadiusbymember key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]


###命令示例

1、單一添加區域

GEOADD beijing-area 116.2161254883 39.8865577059 shijingshan 

批量添加區域

geoadd Beijing-areas 116.2161254883 39.8865577059 ShiJingShan 116.1611938477 39.7283134103 FangShan 116.3534545898 39.7071866568 DaXing 116.4166259766 39.9097362345 DongChenQu

2、查看已經添加的地理信息,可以單個member或多個查詢

    192.168.1.130:6379> geopos Beijing-areas ShiJingShan FangShan

    1) 1) "116.21612817049026489"

       2) "39.88655846536294547"

    2) 1) "116.16119652986526489"

       2) "39.72831328866426048"

3、GEODIST命令來實現計算兩個位置之間的距離,通過已存在的KEY下的2個位置計算距離,單位的距離有m米km千米等

192.168.1.130:6379> geodist Beijing-areas ShiJingShan FangShan m

"18216.0860"

4、georadius查看當前位置的附近的所有位置 以及參數使用:[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

添加測試數據:

geoadd beijing 116.6638183594 39.8928799003 tongzhou

geoadd beijing 116.3534545898 39.7071866568 daxing

geoadd beijing 116.2161254883 39.8865577059 shijingshan

geoadd beijing 116.1611938477 39.7283134103 fangshan

georadius beijing 116.6875076294 39.8953822745 5000 m

       1、統計5000m範圍內附近的位置取最遠一個位置

        georadius beijing 116.6875076294 39.8953822745 50000 m COUNT 1 DESC ##ASC 當前位置最近的位置排序,當使用count類似limit

       2、統計5000m範圍內附近的位置取最遠一個位置相差的距離--withdist 當前位置相差的距離計算

          georadius beijing 116.6875076294 39.8953822745 50000 m COUNT 1 DESC withdist   

       3、統計5000m範圍內附近的位置並顯示的經緯度信息 ---withcoord 顯示經緯度  

        georadius beijing 116.6875076294 39.8953822745 50000 m  DESC withcoord 

4、georadiusbymember 顯示已添加的某個位置爲中心點的距離多少範圍內的信息。

    192.168.1.130:6379> georadiusbymember beijing shijingshan 5000 m

    1) "shijingshan"

    192.168.1.130:6379> georadiusbymember beijing shijingshan 50000 m

    1) "shijingshan"

    2) "tongzhou"

    3) "fangshan"

    4) "daxing" 

 


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