GEO(地理信息定位)


核心知識點:

1.GEO是利用zset來存儲地理位置信息,可以用來計算地理位置之間的距離,也可以做統計;

2.命令:geoadd geopos geodist geohash georadius/georadiusbymember;

3.geohash字符串越長越精准,字符串越相近距離越近。

 

Redis3.2版本提供了GEO(地理信息定位)功能,支持存儲地理位置信息用來實現諸如附近位置、

搖一搖這類依賴於地理位置信息的功能,對於需要實現這些功能的開發者來說是一大福音。

GEO功能是Redis的另一位作者Matt Stancliff借鑒NoSQL數據庫Ardb實現的,Ardb的作者來自中國,它提供了優秀的GEO功能。

使用GEO的主要命令如下:

1.增加地理位置信息

geoadd key longitude latitude member [longitude latitude member ...]

longitude、latitude、member分別是該地理位置的經度、緯度、成員。本篇文章以下表的5個城市為例:

127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 1
127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 0

返回的結果代表添加成功的個數,如果返回0代表已經存在。

geoadd還可以用來更新地理位置信息,雖然返回0,geoadd可以同時添加多個地理位置信息。

127.0.0.1:6379> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4

 

2.獲取地理位置信息

geopos key member [member ...]

獲取地理位置信息:

127.0.0.1:6379> geopos cities:locations tianjin
1) 1) "117.12000042200088501"
   2) "39.0800000535766543"

 

3.獲取兩個地理位置的距離

geodist key member1 member2 [unit]

其中unit代表返回結果的單位,包含以下四種:

  • m(meters)代表米
  • km(kilometers)代表公里
  • mi(miles)代表英里
  • ft(feet)代表尺

下面結算北京到天津的距離,並以公里為單位:

127.0.0.1:6379> geodist cities:locations beijing tianjin km
"89.2061"

 

4.獲取指定位置范圍內的地理信息位置集合

georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

georadiusbymember key member radiusm m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

georadius和georadiusbymember兩個命令的作用是一樣的,都是以一個地理位置為中心算出指定半徑內的其它地理信息位置,

不同的是georadius命令的中心位置給出了具體的經緯度,georadiusbymember只需給出成員即可,

其中radius m|km|ft|mi是必須參數,指定了半徑,帶單位,下面是它可選參數的解釋:

  • withcoord:返回結果中包含經緯度;
  • withdist:返回結果中包含離中心節點位置的距離;
  • withhash:返回結果中包含geohash;
  • COUNT count:指定返回結果的數量;
  • asc|desc:指定結果按照離中心節點的距離做升序或者降序;
  • store key:將返回結果的地理位置信息保存到指定鍵;
  • storedist key:將返回結果離中心離中心節點的距離保存到指定鍵。
127.0.0.1:6379> georadiusbymember cities:locations beijing 100 km  #距離北京100km內的城市
1) "beijing"
2) "tianjin"

 

5.獲取geohash 

geohash key member [member ... ]

Redis使用geohash將二維經緯度轉換為一維字符串:

127.0.0.1:6379> geohash cities:locations beijing
1) "wx48ypbe2q0"

geohash有如下特點:

  • GEO的數據類型為zset,Redis將所有地理位置信息的geohash存放在zset中。
  • 字符串越長,表示的位置更精准。
  • 兩個字符串越相似,它們之間的距離越近,Redis利用字符串前綴匹配算法實現相關命令
  • geohash編碼和經緯度是可以相互轉換的。

Redis正是使用有序集合並結合geohash的特性實現了GEO的若干命令。

 

6.刪除地理位置信息

zrem key member

GEO沒有提供刪除成員的命令,但是因為GEO的底層實現是zset,所有可以借用zrem實現對地理位置信息的刪除。

127.0.0.1:6379> zrem cities:locations tangshan
(integer) 1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM