新聞中心

Redis GEO 提供了 6 個常用命令:
- GEOADD
- GEOPOS
- GEODIST
- GEORADIUS
- GEORADIUSBYMEMBER
- GEOHASH
Redis GEO 有很多應(yīng)用場景,舉一個簡單的例子,你一定點過外賣,或者用過打車軟件,在這種 APP上會顯示“店家距離你有多少米”或者“司機師傅距離你有多遠”,類似這種功能就可以使用 Redis GEO 實現(xiàn)。數(shù)據(jù)庫中存放著商家所處的經(jīng)緯度,你的位置則由手機定位獲取,這樣 APP 就計算出了最終的距離。再比如微信中附近的人、搖一搖、實時定位等功能都依賴地理位置實現(xiàn)。
GEO 提供以下操作命令,如下表所示:
| 序號 | 命令 | 說明 |
|---|---|---|
| 1 | GEOADD | 將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的 key 中。 |
| 2 | GEOPOS | 從 key 里返回所有給定位置元素的位置(即經(jīng)度和緯度) |
| 3 | GEODIST | 返回兩個地理位置間的距離,如果兩個位置之間的其中一個不存在, 那么命令返回空值。 |
| 4 | GEORADIUS | 根據(jù)給定地理位置坐標(經(jīng)緯度)獲取指定范圍內(nèi)的地理位置集合。 |
| 5 | GEORADIUSBYMEMBER | 根據(jù)給定地理位置(具體的位置元素)獲取指定范圍內(nèi)的地理位置集合。 |
| 6 | GEOHASH | 獲取一個或者多個的地理位置的 GEOHASH 值。 |
| 7 | ZREM | 通過有序集合的 zrem 命令實現(xiàn)對地理位置信息的刪除。 |
1) GEOADD
將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的 key 中。語法格式如下:
GEOADD key longitude latitude member [longitude latitude member ...]
- longitude:位置地點所處的經(jīng)度;
- latitude:位置地點所處的緯度;
- member:位置名稱。
將給定的經(jīng)緯度的位置名稱(緯度、經(jīng)度、名字)與 key 相對應(yīng),這些數(shù)據(jù)以有序集合的形式進行儲存。
GEOADD命令以標準的
x,y形式接受參數(shù), 所以用戶必須先輸入經(jīng)度,然后再輸入緯度。
GEOADD命令能夠記錄的坐標數(shù)量是有限的,如果位置非常接近兩極(南極/北極)區(qū)域,那么將無法被索引到。因此當您輸入經(jīng)緯度時,需要注意以下規(guī)則:
- 有效的經(jīng)度介于 -180 度至 180 度之間。
- 有效的緯度介于 -85.05112878 度至 85.05112878 度之間。
注意:如果您輸入一個超出范圍的經(jīng)緯度時,GEOADD 命令將返回一個錯誤。
示例演示如下:
#添加城市地理位置 127.0.0.1:6379> geoadd city 116.20 39.56 beijing 120.52 30.40 shanghai (integer) 2 #查詢城市地理位置 127.0.0.1:6379> GEOPOS city beijing shanghai 1) 1) "116.19999736547470093" 2) "39.56000019952067248" 2) 1) "120.52000075578689575" 2) "30.39999952668997452"
2) GEODIST
該命令用于獲取兩個地理位置間的距離。返回值為雙精度浮點數(shù),其語法格式如下:
GEODIST key member1 member2 [unit]
參數(shù) unit 是表示距離單位,取值如下所示:
- m 表示單位為米;
- km 表示單位為千米;
- mi 表示單位為英里;
- ft 表示單位為英尺。
注意:如果沒有指出距離單位,那么默認取值為
m。示例如下:
127.0.0.1:6379> GEODIST city beijing shanghai "1091868.8970" 127.0.0.1:6379> GEODIST city beijing shanghai km "1091.8689" 127.0.0.1:6379> GEODIST city beijing shanghai mi "678.4576"
注意:計算舉例時存在 0.5% 左右的誤差,這是由于 Redis GEO 把地球假設(shè)成了完美的球體。
3) GEORADIUS
以給定的經(jīng)緯度為中心,計算出 key 包含的地理位置元素與中心的距離不超過給定最大距離的所有位置元素,并將其返回。
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]
參數(shù)說明:
- WITHDIST :在返回位置元素的同時, 將位置元素與中心之間的距離也一并返回。
- WITHCOORD :返回位置元素的經(jīng)度和維度。
- WITHHASH :采用 GEOHASH 對位置元素進行編碼,以 52 位有符號整數(shù)的形式返回有序集合的分值,該選項主要用于底層調(diào)試,實際作用不大。
- COUNT:指定返回位置元素的數(shù)量,在數(shù)據(jù)量非常大時,可以使用此參數(shù)限制元素的返回數(shù)量,從而加快計算速度。
注意:該命令默認返回的是未排序的位置元素。通過 ASC 與 DESC 可讓返回的位置元素以升序或者降序方式排列。
命令應(yīng)用示例如下:
#添加幾個地理位置元素
127.0.0.1:6379> GEOADD city 106.45 29.56 chongqing 120.33 36.06 qingdao 103.73 36.03 lanzhou
(integer) 3
127.0.0.1:6379> GEOADD city 106.71 26.56 guiyang
(integer) 1
#以首都的坐標為中心,計算各個城市距離首都的距離,最大范圍設(shè)置為1500km
#同時返回距離,與位置元素的經(jīng)緯度
127.0.0.1:6379> GEORADIUS city 116.41 39.91 1500 km WITHCOORD WITHDIST
1) 1) "chongqing"
2) "1465.5618"
3) 1) "106.4500012993812561"
2) "29.56000053864853072"
2) 1) "lanzhou"
2) "1191.2793"
3) 1) "103.72999995946884155"
2) "36.03000049919800318"
3) 1) "shanghai"
2) "1121.4882"
3) 1) "120.52000075578689575"
2) "30.39999952668997452"
4) 1) "qingdao"
2) "548.9304"
3) 1) "120.3299984335899353"
2) "36.05999892411877994"
5) 1) "beijing"
2) "42.8734"
3) 1) "116.19999736547470093"
2) "39.56000019952067248"
4) GEORADIUSBYMEMBER
根據(jù)給定的地理位置坐標(即經(jīng)緯度)獲取指定范圍內(nèi)的位置元素集合。其語法格式如下:
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
- m :米,默認單位;
- km :千米(可選);
- mi :英里(可選);
- ft :英尺(可選);
- ASC:根據(jù)距離將查找結(jié)果從近到遠排序;
- DESC:根據(jù)距離將查找結(jié)果從遠到近排序。
該命令與 GEORADIUS 命令相似,不過它選擇的中心的是具體的位置元素,而非經(jīng)緯度坐標。示例如下:
#以貴陽為中心,最大距離不超過900km
127.0.0.1:6379> GEORADIUSBYMEMBER city guiyang 900 km WITHCOORD WITHDIST
1) 1) "guiyang"
2) "0.0000"
3) 1) "106.70999854803085327"
2) "26.56000089385899798"
#只有重慶符合條件
2) 1) "chongqing"
2) "334.6529"
3) 1) "106.4500012993812561"
2) "29.56000053864853072"
5) GEOHASH
返回一個或多個位置元素的哈希字符串,該字符串具有唯一 ID 標識,它與給定的位置元素一一對應(yīng)。示例如下:
127.0.0.1:6379> GEOHASH city lanzhou beijing shanghai 1) "wq3ubrjcun0" 2) "wx49h1wm8n0" 3) "wtmsyqpuzd0"
6) ZREM
用于刪除指定的地理位置元素,示例如下:
127.0.0.1:6379> zrem city beijing shanghai (integer) 2
了解更多命令請參考:http://redisdoc.com/geo/geohash.html
當前題目:RedisGEO地理位置
文章鏈接:http://m.fisionsoft.com.cn/article/coeghgd.html


咨詢
建站咨詢
