GEOHASH:获取指定位置的Geohash值
用户可以通过向 GEOHASH 命令传入一个或多个位置来获得这些位置对应的经纬度坐标的 Geohash 表示:
redis> GEOHASH Guangdong-cities Qingyuan Guangzhou Shenzhen
1) "ws0w0phgp70" -- 清远市经纬度坐标的Geohash值
2) "ws0e89curg0" -- 广州市经纬度坐标的Geohash值
3) "ws107659240" -- 深圳市经纬度坐标的Geohash值
Geohash 是一种编码格式,这种格式可以将用户给定的经度和纬度转换成单个 Geohash 值,也可以根据给定的 Geohash 值还原出被转换的经度和纬度。比如,通过使用 Geohash 编码程序,我们可以将清远市的经纬度(113.20996731519699097,23.59367501967128788)编码为 Geohash 值"ws0w0phgp70",也可以根据这个 Geohash 值还原出清远市的经纬度。
当应用程序因为某些原因只能使用单个值去表示位置的经纬度时,我们就可以考虑使用 GEOHASH 命令去获取位置坐标的 Geohash 值,而不是直接使用 GEOPOS 命令去获取位置的经纬度。
在进行范围查找时获取Geohash值
GEORADIUS 命令和 GEORADIUSBYMEMBER 命令都支持 WITHHASH 选项,使用了这个选项的命令将会在结果中包含被匹配位置的 Geohash 值:
GEORADIUS location_set longitude latitude radius unit [WITHHASH]
GEORADIUSBYMEMBER location_set name radius unit [WITHHASH]
作为例子,以下代码展示了如何在查找广州市附近城市的同时,获取这些城市的 Geohash 值:
redis> GEORADIUSBYMEMBER Guangdong-cities "Guangzhou" 200 km WITHHASH
1) 1) "Zhongshan" -- 被匹配的位置
2) (integer) 4046330600091985 -- 该位置经纬度坐标的Geohash值
2) 1) "Shenzhen"
2) (integer) 4046432447218769
3) 1) "Foshan"
2) (integer) 4046506835759376
4) 1) "Guangzhou"
2) (integer) 4046533621643967
5) 1) "Dongguan"
2) (integer) 4046540375616238
6) 1) "Qingyuan"
2) (integer) 4046597933543051
需要注意的是,与 GEOHASH 命令不一样,GEORADIUS 命令和 GEORADIUSBYMEMBER 命令返回的是被解释为数字的 Geohash 值。而 GEOHASH 命令返回的则是被解释为字符串的 Geohash 值。比如 GEOHASH 命令在获取清远市的 Geohash 值时返回的是字符串 "ws0w0phgp70",而 GEORADIUS 命令获取的 Geohash 值却是数字 4046597933543051,不过这两个值底层的二进制位是完全相同的。