geospatial 地理位置
- Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
- Redis GEO 操作方法有:
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。
常用命令(只有6个)
1. geoadd key longitude latitude member [longitude latitude member ...]
将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中
- (先经度后维度,顺序不能错,否则超出经纬度范围报错)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> geoadd china:city 121.48941 31.40527 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 114.02919 30.58203 wuhan
(integer) 1
127.0.0.1:6379> geoadd china:city 113.88308 22.55329 shenzhen 116.23128 40.22077 beijing
(integer) 2
2. geodist key member1 member2 [m|km|ft|mi]
用于返回member1 member2 给定位置之间的距离
127.0.0.1:6379> geodist china:city shanghai wuhan
"717025.9339"
127.0.0.1:6379> geodist china:city shanghai wuhan km
"717.0259"
127.0.0.1:6379> geodist china:city beijing shenzhen km
"1977.4843"
127.0.0.1:6379> geodist china:city shanghai beijing km
"1088.6444"
127.0.0.1:6379> geodist china:city wuhan beijing km
"1090.4028"
3. georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
由给定的经度和纬度为圆心, 给的距离为半径,返回方圆范围内的member。
- 携带参数withcoord,可以附带显示满足要求的城市的经纬度
- 携带参数withdist 可以附带显示距离满足要求的城市的直线距离
- 携带参数COUNT count 可以指定只显示符合要求member的个数
127.0.0.1:6379> georadius china:city 112.98626 28.25591 500 km
1) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 1000 km
1) "shenzhen"
2) "wuhan"
3) "shanghai"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km
1) "shenzhen"
2) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km withcoord
1) 1) "shenzhen"
2) 1) "113.88307839632034302"
2) "22.55329111565713873"
2) 1) "changsha"
2) 1) "112.98626035451889038"
2) "28.25590931465907119"
3) 1) "wuhan"
2) 1) "114.02918905019760132"
2) "30.58203052674790712"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km withdist
1) 1) "shenzhen"
2) "640.6404"
2) 1) "changsha"
2) "0.0001"
3) 1) "wuhan"
2) "277.7515"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km count 2
1) "changsha"
2) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km withcoord withdist count 2
1) 1) "changsha"
2) "0.0001"
3) 1) "112.98626035451889038"
2) "28.25590931465907119"
2) 1) "wuhan"
2) "277.7515"
3) 1) "114.02918905019760132"
2) "30.58203052674790712"
127.0.0.1:6379>
4. GEORADIUSBYMEMBER key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
由给定的member为圆心, 给的距离为半径,返回方圆范围内的member
127.0.0.1:6379> geoadd china:city 112.98626 28.25591 changsha
(integer) 1
127.0.0.1:6379> georadiusbymember china:city changsha 500 km
1) "changsha"
2) "wuhan"
127.0.0.1:6379> georadiusbymember china:city changsha 1000 km
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
5. geopos key member [member ...]
用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.23128265142440796"
2) "40.22076905438526495"
6. geohash key member [member ...]
用于获取一个或多个位置元素的 geohash 值
- 返回11个字符的geohash字符串,用于将二维的经纬度转化为一维的字符串,如果两个字符串越接近,则距离越近
127.0.0.1:6379> geohash china:city wuhan
1) "wt3jfz390x0"
127.0.0.1:6379> geohash china:city beijing shenzhen
1) "wx4sucvncn0"
2) "ws0br3xnkn0"
127.0.0.1:6379>
扩展
Geo底层实现原理是Zset,可以使用Zset命令来操作Geo(官方未给出的删除和显示操作)
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
127.0.0.1:6379>
完整测试用例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> geoadd china:city 121.48941 31.40527 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 114.02919 30.58203 wuhan
(integer) 1
127.0.0.1:6379> geoadd china:city 113.88308 22.55329 shenzhen 116.23128 40.22077 beijing
(integer) 2
127.0.0.1:6379> geodist china:city shanghai wuhan
"717025.9339"
127.0.0.1:6379> geodist china:city shanghai wuhan km
"717.0259"
127.0.0.1:6379> geodist china:city beijing shenzhen km
"1977.4843"
127.0.0.1:6379> geodist china:city shanghai beijing km
"1088.6444"
127.0.0.1:6379> geodist china:city wuhan beijing km
"1090.4028"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 500 km
1) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 1000 km
1) "shenzhen"
2) "wuhan"
3) "shanghai"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km
1) "shenzhen"
2) "wuhan"
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.23128265142440796"
2) "40.22076905438526495"
127.0.0.1:6379> geoadd china:city 112.98626 28.25591 changsha
(integer) 1
127.0.0.1:6379> georadiusbymember china:city changsha 500 km
1) "changsha"
2) "wuhan"
127.0.0.1:6379> georadiusbymember china:city changsha 1000 km
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
127.0.0.1:6379> geohash china:city wuhan
1) "wt3jfz390x0"
127.0.0.1:6379> geohash china:city beijing shenzhen
1) "wx4sucvncn0"
2) "ws0br3xnkn0"
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
127.0.0.1:6379>