天天看點

Redis(九)—— Geospatial地理位置的使用Redis(九)—— Geospatial地理位置

Redis(九)—— Geospatial地理位置

Redis GEO 主要用于存儲地理位置資訊,并對存儲的資訊進行操作,該功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。
  • geopos:擷取地理位置的坐标。
  • geodist:計算兩個位置之間的距離。
  • georadius:根據使用者給定的經緯度坐标來擷取指定範圍内的地理位置集合。
  • georadiusbymember:根據儲存在位置集合裡面的某個地點擷取指定範圍内的地理位置集合。
  • geohash:傳回一個或多個位置對象的 geohash 值。
geoadd:添加地理位置的坐标。

geoadd 用于存儲指定的地理空間位置,可以将一個或多個經度(longitude)、緯度(latitude)、位置名稱(member)添加到指定的 key 中。南北兩級無法添加。

平時,我們一般會直接下載下傳城市資料,然後通過java程式導入。

經度範圍是0-180°,緯度範圍是0-90°。

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
 (integer) 1
 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 121.47 31.23 shanghai
 (integer) 2
           
geopos:擷取地理位置的坐标

geopos 用于從給定的 key 裡傳回所有指定名稱(member)的位置(經度和緯度),不存在的傳回 nil。

127.0.0.1:6379> geopos china:city beijing shanghai
 1) 1) "116.39999896287918091"
    2) "39.90000009167092543"
 2) 1) "121.47000163793563843"
    2) "31.22999903975783553"
 127.0.0.1:6379> geopos china:city nanchang
 1) (nil)
           
geodist:計算兩個位置之間的距離

geodist 用于傳回兩個給定位置之間的距離,直線距離

最後一個距離機關參數說明:

  • m :米,預設機關。
  • km :千米。
  • mi :英裡。
  • ft :英尺。
127.0.0.1:6379> geodist china:city beijing chongqing   #北京和重慶之間的距離  預設機關m
 "1464070.8051"  #預設機關m
 127.0.0.1:6379> geodist china:city beijing chongqing km
 "1464.0708"
 127.0.0.1:6379> geodist china:city beijing chongqing ft
 "4803381.9063"
 127.0.0.1:6379> geodist china:city beijing chongqing mi
 "909.7337"
 127.0.0.1:6379> geodist china:city beijing nanchang  #,不存在的傳回 nil
 (nil)
           

georadius:根據使用者給定的經緯度坐标來擷取指定範圍内的地理位置集合

georadiusbymember:根據儲存在位置集合裡面的某個地點擷取指定範圍内的地理位置集合

  • georadius 以給定的經緯度為中心, 傳回鍵包含的位置元素當中, 與中心的距離不超過給定最大距離的所有位置元素。
  • georadiusbymember 和 GEORADIUS 指令一樣, 都可以找出位于指定範圍内的元素, 但是 georadiusbymember 的中心點是由給定的位置元素決定的, 而不是使用經度和緯度來決定中心點。
  • 參數說明:
    • m :米,預設機關。
    • km :千米。
    • mi :英裡。
    • ft :英尺。
    • WITHDIST: 在傳回位置元素的同時, 将位置元素與中心之間的距離也一并傳回。
    • WITHCOORD: 将位置元素的經度和次元也一并傳回。
    • WITHHASH: 以 52 位有符号整數的形式, 傳回位置元素經過原始 geohash 編碼的有序集合分值。 這個選項主要用于底層應用或者調試, 實際中的作用并不大。
    • COUNT 限定傳回的記錄數。
    • ASC: 查找結果根據距離從近到遠排序。
    • DESC: 查找結果根據從遠到近排序,預設。

georadius 執行個體:

#================傳回以 119 35 中心,半徑1000km内所有城市================
 127.0.0.1:6379> GEORADIUS china:city 119 35 1000 km
 1) "beijing"
 2) "shanghai"
 #================傳回以 119 35 中心,半徑1000km内所有城市,并将位置元素與中心之間的距離也一并傳回================
 127.0.0.1:6379> GEORADIUS china:city 119 35 1000 km withdist
 1) 1) "beijing"
    2) "591.3126"
 2) 1) "shanghai"
    2) "478.2625"
 #================傳回以 119 35 中心,半徑1000km内所有城市,将位置元素的經度和次元也一并傳回================
 127.0.0.1:6379> GEORADIUS china:city 119 35 1000 km withcoord
 1) 1) "beijing"
    2) 1) "116.39999896287918091"
       2) "39.90000009167092543"
 2) 1) "shanghai"
    2) 1) "121.47000163793563843"
       2) "31.22999903975783553"
 #傳回以 119 35 中心,半徑1000km内所有城市,将位置元素與中心之間的距離一并傳回,将位置元素的經度和次元也一并傳回    
 127.0.0.1:6379> GEORADIUS china:city 119 35 1000 km withcoord withdist
 1) 1) "beijing"
    2) "591.3126"
    3) 1) "116.39999896287918091"
       2) "39.90000009167092543"
 2) 1) "shanghai"
    2) "478.2625"
    3) 1) "121.47000163793563843"
       2) "31.22999903975783553"
 #================================限定傳回的記錄數為1================================      
 127.0.0.1:6379> GEORADIUS china:city 119 35 1000 km  count 1
 1) "shanghai"
 #================================查找結果根據距離從近到遠排序================================
 127.0.0.1:6379> GEORADIUS china:city 119 35 1000 km  withdist asc
 1) 1) "shanghai"
    2) "478.2625"
 2) 1) "beijing"
    2) "591.3126"
 ​
           

georadiusbymember執行個體:

127.0.0.1:6379> GEOADD Sicily 13.583333 37.316667 "Agrigento"
 (integer) 1
 127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
 (integer) 2
 127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Agrigento 100 km
 1) "Agrigento"
 2) "Palermo"
 127.0.0.1:6379> GEORADIUSBYMEMBER Sicily Agrigento 100 km withdist
 1) 1) "Agrigento"
    2) "0.0000"
 2) 1) "Palermo"
    2) "90.9778"
           
geohash:傳回一個或多個位置對象的 geohash 值。
  • Redis GEO 使用 geohash 來儲存地理位置的坐标,
  • 将二維經緯度轉化為一維字元串,如果兩個字元串越接近,則兩個位置越接近。
  • geohash 用于擷取一個或多個位置元素的 geohash 值。
127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
 (integer) 2
 127.0.0.1:6379> GEOHASH Sicily Palermo Catania
 1) "sqc8b49rny0"
 2) "sqdtr74hyu0"
           
geo底層實作原理其實就是zset,我們可以通過zset指令來操作geo

嘗試用zset的查詢指令,查詢添加的GEO資訊:

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
 (integer) 1
 127.0.0.1:6379>  geoadd china:city 106.50 29.53 chongqing 121.47 31.23 shanghai
 (integer) 2
 127.0.0.1:6379> zrange china:city 0 -1 withscores
 1) "chongqing"
 2) "4026042091628984"
 3) "shanghai"
 4) "4054803462927619"
 5) "beijing"
 6) "4069885360207904"
           

可以查到 “chongqing"的位置資訊為"4026042091628984”, “shanghai"的位置資訊為"4054803462927619”, “beijing"的位置資訊為"4069885360207904”。

4026042091628984為對經緯度進行編碼後的值。使用4026042091628984做為score 能夠快速實作對經緯度的索引。

至此能夠推斷出Redis GEO 添加經、緯度位置資訊的指令的過程是:

ZADD china:city 4026042091628984 chongqing
 ZADD china:city 4054803462927619 shanghai
 ZADD china:city 4069885360207904 beijing
           

對資料進行删除:

127.0.0.1:6379> zrem china:city chongqing
 (integer) 1
 127.0.0.1:6379> zrange china:city 0 -1
 1) "shanghai"
 2) "beijing"
 ​
           

\

繼續閱讀