简介
Redis 3.2 中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写
。该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
命令
1、geoadd
(1)格式
geoadd<key>< longitude><latitude><member> [longitude latitude member...]
添加地理位置(经度,纬度,名称)
(2)实例
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing
(integer) 3
127.0.0.1:6379>
两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
有效的经度从 -180 度到 180
度。有效的纬度从 -85.05112878 度到 85.05112878
度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
已经添加的数据,是无法再次往里面添加的。
2、geopos
(1)格式
geopos <key><member> [member...] 获得指定地区的坐标值
(2)实例
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.38000041246414185"
2) "39.90000009167092543"
127.0.0.1:6379>
3、geodist
(1)格式
geodist<key><member1><member2> [m|km|ft|mi ] 获取两个位置之间的直线距离
(2)实例
获取两个位置之间的直线距离
127.0.0.1:6379> geodist china:city beijing shanghai km
"1068.1535"
127.0.0.1:6379>
## 单位为米
127.0.0.1:6379> geodist china:city beijing shanghai m
"1068153.5181"
127.0.0.1:6379>
单位:
m
表示单位为米[默认值]。
km
表示单位为千米。
mi
表示单位为英里。
ft
表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位
4、georadius
(1)格式
georadius<key>< longitude><latitude>radius m|km|ft|mi
以给定的经纬度为中心,找出某一半径内的元素
(2)实例
以110,30 这个经纬度为中心,寻找方圆1000km内的城市
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
127.0.0.1:6379>
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km #以110,30 这个经纬度为中心,寻找方圆500km内的城市
1) "chongqing"
127.0.0.1:6379>
显示到中间距离的位置
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist
1) 1) "chongqing"
2) "341.9374"
127.0.0.1:6379>
显示他人定位信息
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
筛选出指定的结果!
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 0
(error) ERR COUNT must be > 0
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379>
5、georadiusbymember
(1)格式
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES
(2)实例
找出位于指定元素周围的其他元素!
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km
1) "beijing"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "shanghai"
127.0.0.1:6379>
6、geohash
(1)格式
127.0.0.1:6379> geohash key member [member ...]
返回一个或多个位置元素的 Geohash 表示,该命令将返回11个字符的Geohash字符串!
(2)命令
将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4fbr966e0"
2) "wm5xzrybty0"
127.0.0.1:6379>
GEO 底层的实现原理其实就是 Zset!我们可以使用Zset命令来操作geo!
127.0.0.1:6379> zrange china:city 0 -1 # 查看地图中全部的元素
1) "chongqing"
2) "shenzhen"
3) "shanghai"
4) "beijing"
127.0.0.1:6379> zrem china:city beijing # 移除指定元素!
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "shenzhen"
3) "shanghai"
127.0.0.1:6379>