- 朋友的定位,附近的人,打车距离计算
-
redis
的geo
在redis3.2
就推出了,可以推算地理位置的信息,两地之间的距离,方圆几公里的人 - 在线城市经纬度查询工具:链接
- 基本命令(以
geo
开头):
命令 | 描述 |
---|---|
geoadd | 将具体经纬度的坐标存入一个有序集合 |
geopos | 获取集合中的一个/多个成员坐标 |
geodist | 返回两个给定位置之间的距离(默认以米作为单位) |
georadius | 以给定的经纬度为中心, 找出某一半径内的元素 |
geohash | 返回一个或多个位置元素的 geohash 表示,使用 geohash 位置 52 点整数编码 |
georadiusbymember | 功能与 georadius 相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点 |
- 添加地理位置的坐标:
geoadd
1、 将指定的地理空间位置(经度、纬度、名称)添加到指定的key
中(先经度,后纬度)
2、 两极(南北极 )无法直接添加
3、 一般会下载城市数据,通过java
等程序一次性导入
127.0.0.1:6379> geoadd china:city 116.4 39.9 beijing # 添加北京的经纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 121.4 31.2 shanghai # 添加上海的经纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 114.1 22.5 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 113.3 23.1 guangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 114.2 22.3 xianggang
(integer) 1
127.0.0.1:6379> geoadd china:city 113.5 22.2 aomen
(integer) 1
127.0.0.1:6379> geoadd china:city 106.5 29.5 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 108.9 34.2 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 120.1 30.2 hangzhou 91.1 29.6 lasa # 批量添加城市位置信息
(integer) 2
有效经纬度
- 有效的经度从
-180 度
到180 度
- 有效的纬度从
-85.05112878 度
到85.05112878 度
- 指定单位的参数
unit
必须是以下单位的其中一个:-
m
表示单位为米。 -
km
表示单位为千米。 -
mi
表示单位为英里。 -
ft
表示单位为英尺。
-
- 获取地理位置的坐标:
geopos
127.0.0.1:6379> geopos china:city beijing shanghai xian
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "121.40000134706497192"
2) "31.20000061483705878"
3) 1) "108.90000075101852417"
2) "34.20000025962658441"
- 计算两个位置之间的距离 :
geodist
应用:两人之间的直线距离
127.0.0.1:6379> geodist china:city beijing lasa # 默认为米
"2567992.5356"
127.0.0.1:6379> geodist china:city beijing lasa km # 千米
"2567.9925"
127.0.0.1:6379> geodist china:city beijing lasa mi # 英里
"1595.6805"
- 根据经纬度坐标,获取指定范围内的地理位置集合:
georadius
以给定的经纬度为中心,找出某一半径内所有的元素
实现附近的人:获取所有附近的人的地址(GPS
)
# 范围查找 经度110 纬度 30为圆心 半径100km内所有的城市
127.0.0.1:6379> georadius china:city 110 30 100 km
(empty array)
# 范围查找 经度110 纬度 30为圆心 半径1000km内所有的城市
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "aomen"
4) "xianggang"
5) "shenzhen"
6) "guangzhou"
7) "hangzhou"
# 范围查找 经度110 纬度 30为圆心 半径100km内所有的城市 带上经纬度和城市距离该点的直线距离
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist
1) 1) "chongqing"
2) "342.5131"
3) 1) "106.49999767541885376"
2) "29.50000115408581536"
2) 1) "xian"
2) "478.4989"
3) 1) "108.90000075101852417"
2) "34.20000025962658441"
3) 1) "aomen"
2) "935.1758"
3) 1) "113.49999994039535522"
2) "22.19999914574732003"
4) 1) "xianggang"
2) "953.3433"
3) 1) "114.19999748468399048"
2) "22.29999896492555678"
5) 1) "shenzhen"
2) "928.8366"
3) 1) "114.09999936819076538"
2) "22.50000113800319212"
6) 1) "guangzhou"
2) "834.6077"
3) 1) "113.29999834299087524"
2) "23.10000005307264104"
7) 1) "hangzhou"
2) "971.8350"
3) 1) "120.09999901056289673"
2) "30.19999988833350102"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2 # count 控制个数
1) 1) "chongqing"
2) "342.5131"
3) 1) "106.49999767541885376"
2) "29.50000115408581536"
2) 1) "xian"
2) "478.4989"
3) 1) "108.90000075101852417"
2) "34.20000025962658441"
关于
georadius
的参数
通过georadius
就可以完成附近的人
功能
withcoord
:带上坐标
withdist
:带上距离,单位与半径单位相同
count n
: 只显示前n
个(按距离递增排序)根据地点,获取指定范围内的地理位置集合:
georadiusbymember
# 根据给定的元素,确定中心点,再进行查找
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km withdist
1) 1) "beijing"
2) "0.0000"
2) 1) "xian"
2) "918.6872"
127.0.0.1:6379> georadiusbymember china:city beijing 1500 km withdist
1) 1) "chongqing"
2) "1466.7920"
2) 1) "xian"
2) "918.6872"
3) 1) "hangzhou"
2) "1129.9710"
4) 1) "shanghai"
2) "1067.7424"
5) 1) "beijing"
2) "0.0000"
- 返回一个或多个位置对象的
geohash
值:geohash
# 将二维的经纬度,转换为一维的字符串,经过 hash 之后的结果
127.0.0.1:6379> geohash china:city beijing shanghai
1) "wx4fbxxfke0" # 如果两个字符串越像,则代表越接近
2) "wtw36xbc1j0"
底层原理:使用经纬度定位地理坐标,并用一个有序集合
zset
保存,所以zset
命令也可以使用
127.0.0.1:6379> zrange china:city 0 -1 # 查看所有的元素
1) "lasa"
2) "chongqing"
3) "xian"
4) "aomen"
5) "xianggang"
6) "shenzhen"
7) "guangzhou"
8) "hangzhou"
9) "shanghai"
10) "beijing"
127.0.0.1:6379> zrem china:city beijing shanghai # 删除指定元素
(integer) 2
127.0.0.1:6379> zrange china:city 0 -1
1) "lasa"
2) "chongqing"
3) "xian"
4) "aomen"
5) "xianggang"
6) "shenzhen"
7) "guangzhou"
8) "hangzhou"