Redis 笔记(九)-三种特殊类型 Geospatial(地理位置)

  • 朋友的定位,附近的人,打车距离计算
  • redisgeoredis3.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

有效经纬度

  1. 有效的经度从 -180 度180 度
  2. 有效的纬度从 -85.05112878 度85.05112878 度
  3. 指定单位的参数 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"
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容