redis系列文章:
https://liudongdong.top/categories/redis
本篇来源:
https://liudongdong.top/archives/redisjiu-redis-zhi-geospatial

公众号:雨中散步撒哈拉
备注:欢迎关注公众号,一起学习,共同进步!

一、基本概念

Geospatial类型,底层实现原理实现为zset类型!

1. 使用什么样的地球模型(Earth model)?

这只是假设地球是一个球体,因为使用的距离公式是Haversine公式。这个公式仅适用于地球,而不是一个完美的球体。当在社交网站和其他大多数需要查询半径的应用中使用时,这些偏差都不算问题。但是,在最坏的情况下的偏差可能是0.5%,所以一些地理位置很关键的应用还是需要谨慎考虑。

2. 它是如何工作的?

sorted set使用一种称为Geohash的技术进行填充。经度和纬度的位是交错的,以形成一个独特的52位整数. 我们知道,一个sorted set 的double score可以代表一个52位的整数,而不会失去精度。

这种格式允许半径查询检查的1 + 8个领域需要覆盖整个半径,并丢弃元素以外的半径。通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的sorted set中的查询。

GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串

3. 可以做什么?

  1. 查询某个坐标附近的坐标(附近的人功能)

  2. 查询两点间的距离

  3. ……

二、命令实践

由于geo命令过少,不进行了分类,完整命令请看官网,本篇命令请看附录!

中国诚实坐标经纬度查询,进行查询中国城市具体坐标!

1. geoadd 添加经纬元素

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。

返回值
添加到sorted set元素的数目,但不包括已更新score的元素。

127.0.0.1:6379> geoadd china 116.408 39.904 beijing
(integer) 1
127.0.0.1:6379> geoadd china 121.445 31.213 shanghai 117.246 39.117 tianjing
(integer) 2
127.0.0.1:6379> zrange china 0 -1
1) "shanghai"
2) "tianjing"
3) "beijing"
127.0.0.1:6379>

2. geodist获取俩个元素之间直线距离

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  1. m 表示单位为米。

  2. km 表示单位为千米。

  3. mi 表示单位为英里。

  4. ft 表示单位为英尺。
    如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

返回值
计算出的距离会以双精度浮点数的形式被返回。如果给定的位置元素不存在, 那么命令返回空值。

127.0.0.1:6379> zrange china 0 -1
1) "shanghai"
2) "tianjing"
3) "beijing"
127.0.0.1:6379> geodist china beijing shanghai m
"1068232.0171"
127.0.0.1:6379> geodist china beijing shanghai km
"1068.2320"
127.0.0.1:6379>

3. geopos获取指定元素经纬度

从key里返回所有给定位置元素的位置(经度和纬度)。

给定一个sorted set表示的空间索引,密集使用 geoadd 命令,它以获得指定成员的坐标往往是有益的。当空间索引填充通过 geoadd 的坐标转换成一个52位Geohash,所以返回的坐标可能不完全以添加元素的,但小的错误可能会出台。

因为 GEOPOS 命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。

返回值
GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成:第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。

当给定的位置元素不存在时, 对应的数组项为空值。

127.0.0.1:6379> geopos china beijing
1) 1) "116.40800267457962"2) "39.903999881660361"
127.0.0.1:6379> geopos china beijing222
1) (nil)
127.0.0.1:6379>

4. georadius指定经纬度和半径获取元素(附近人功能)

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

范围可以使用以下其中一个单位:

  1. m 表示单位为米。

  2. km 表示单位为千米。

  3. mi 表示单位为英里。

  4. ft 表示单位为英尺。
    在给定以下可选项时, 命令会返回额外的信息:

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试, 实际中的作用并不大。
命令默认返回未排序的位置元素。通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

返回值
在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。
在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:

以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
geohash 整数。
由两个元素组成的坐标,分别为经度和纬度。
举个例子, GEORADIUS Sicily 15 37 200 km WITHCOORD WITHDIST 这样的命令返回的每个子数组都是类似以下格式的:

["Palermo","190.4424",["13.361389338970184","38.115556395496299"]]

# 坐标天津经纬度,半径为1000km范围,进行检索
127.0.0.1:6379> georadius china 117.246 39.117 1000 km withcoord withdist withhash count 3 asc
1) 1) “tianjing”
   2) “0.0001”
   3) (integer) 4069186232887724
   4) 1) “117.24599987268448”
      2) “39.116999378339521”
2) 1) “beijing”
   2) “113.2836”
   3) (integer) 4069885369376452
   4) 1) “116.40800267457962”
      2) “39.903999881660361”
3) 1) “shanghai”
   2) “958.1492”
   3) (integer) 4054756185507317
   4) 1) “121.44499808549881”
      2) “31.213001199663303”
127.0.0.1:6379>


5\. georadiusbymember指定元素和半径进行扫描
--------------------------------这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。关于 GEORADIUSBYMEMBER 命令的更多信息, 请参考 GEORADIUS 命令的文档。

127.0.0.1:6379> georadiusbymember china tianjing 1000 km withcoord withdist withhash count 3 asc
1) 1) “tianjing”
   2) “0.0000”
   3) (integer) 4069186232887724
   4) 1) “117.24599987268448”
      2) “39.116999378339521”
2) 1) “beijing”
   2) “113.2837”
   3) (integer) 4069885369376452
   4) 1) “116.40800267457962”
      2) “39.903999881660361”
3) 1) “shanghai”
   2) “958.1491”
   3) (integer) 4054756185507317
   4) 1) “121.44499808549881”
      2) “31.213001199663303”
127.0.0.1:6379>


6\. geohash坐标以hash表示
--------------------返回一个或多个位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash,在维基百科和geohash.org网站都有相关描述Geohash字符串属性
该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。返回的geohashes具有以下特性:他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
它可以在 geohash.org 网站使用,网址 http://geohash.org/。查询例子:http://geohash.org/sqdtr74hyu0.
与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。
**返回值**
一个数组, 数组的每个项都是一个 geohash 。命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。

127.0.0.1:6379> zrange china 0 -1
1) “shanghai”
2) “tianjing”
3) “beijing”
127.0.0.1:6379> geohash china beijing tianjing
1) “wx4g0bm9xh0”
2) “wwgqecpcjc0”
127.0.0.1:6379>


### 附录| 命令 | 描述 |
| --- | --- |
| Redis GEOHASH 命令 | 返回一个或多个位置元素的 Geohash 表示 |
| Redis GEOPOS 命令 | 从key里返回所有给定位置元素的位置(经度和纬度) |
| Redis GEODIST 命令 | 返回两个给定位置之间的距离 |
| Redis GEORADIUS 命令 | 以给定的经纬度为中心, 找出某一半径内的元素 |
| Redis GEOADD 命令 | 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中 |
| Redis GEORADIUSBYMEMBER 命令 | 找出位于指定范围内的元素,中心点是由给定的位置元素决定 |

redis | 九、redis之Geospatial相关推荐

  1. Redis 九种数据结构及其底层实现 持久化 缓存机制 过期键与内存淘汰 集群等相关知识

    参考内容: B站尚硅谷Redis视频教程 <Redis 6 入门到精通 超详细 教程> B张黑马程序员Redis视频教程 <黑马程序员Redis入门到实战教程,全面透析redis底层 ...

  2. 【redis】redis应用场景,缓存的各种问题

    如果你还不知道redis的基本命令与基本使用方法,请看 [redis]redis基础命令学习集合 缓存 redis还有另外一个重要的应用领域--缓存 引用来自网友的图解释缓存在架构中的位置 默认情况下 ...

  3. 带你学 Redis:Redis简介(一)

    Redis 是什么? Redis 是一个高性能 key-value 的非关系型内存数据库,这里 key-value 可以理解成Java中的 Map.Redis 的 value 支持各种数据结构类型,不 ...

  4. redis:redis介绍和安装、普通连接和连接池、redis 5大数据类型之字符串、Hash、列表、其他操作(通用)、管道、django使用redis、接口缓存

    目录 一. redis介绍和安装 二. 普通连接和连接池 三. redis 5大数据类型之字符串 四. redis 5大数据类型之Hash 五. redis 5大数据类型之列表 六. 其他操作(通用) ...

  5. 最新版本Redis:Redis 7.0 安装使用,编译安装Redis,Redis使用场景-2022年最新Redis图解安装

    最新版本Redis:Redis 7.0 安装使用,编译安装Redis,Redis使用场景. 本章主要目标: 1.Redis介绍 2.下载Redis,编译安装Redis 3.启动Redis使用 4.Re ...

  6. 【檀越剑指大厂--redis】redis高阶篇

    一.数据结构与对象 1.什么是 SDS? Redis 没有直接使用 C 语言传统的字符吕表示 (以空字符结尾的字符数组,以下简称 C 字符串),而是自己构建了 一种名为简单动态字符串(simple d ...

  7. Spring Boot整合Redis以及Redis的原理

    Redis的原理及知识 Redis简介 redis是一个key-value.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  8. 【Redis】Redis安装、应用场景、数据类型、配置文件(很全)、发布订阅、事务、分布式锁、持久化、主从复制、集群等

    文章目录 Redis笔记 Redis 介绍 应用场景 相关技术 安装 Redis 操作及数据类型 Redis 键操作(Key) Redis 字符串(String) Redis 列表(List) Red ...

  9. Redis以及Redis的php扩展安装无错版

    安装Redis 下载最新的 官网:http://redis.io/  或者  http://code.google.com/p/redis/downloads/list 第一步:下载安装编译 #wge ...

  10. 【带你重拾Redis】Redis 哨兵集群实现高可用

    Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 Redis 集群架构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 Redis master 和 sla ...

最新文章

  1. JVM GC 垃圾回收(二)之 判断那些可回收,怎么回收
  2. MFC中的MainFrame Dlg,App,Doc,View的关系
  3. c#中的非托管资源释放 (Finalize和Dispose)
  4. unity导出工程导入到iOS原生工程中详细步骤
  5. windows平台oracle无法调度,windows 2003+Legato networker+oracle 9i (框架)
  6. CF573E Bear and Bowling 贪心、分块、凸包
  7. sql 两表关联查询
  8. 差异表达基因变化倍数_差异表达基因
  9. idea彩虹括号+区域代码高亮插件
  10. ReactOS:基于Windows的开源操作系统
  11. 微信小程序常用组件库收藏备用
  12. centos8以后版本突然不能上网解决
  13. Windows 10设置菜单打不开
  14. GEE加载指定区域、指定时间的影像
  15. %lld,%d,%hd,%hhd在打印时的“潜规则”
  16. 瑞雷波频散曲线_瑞雷波多模式频散曲线的能量计算研究
  17. 微信/QQ域名检测-最新腾讯域名检测官方接口
  18. Datacamp 笔记代码 Supervised Learning with scikit-learn 第一章 Classification
  19. 关于近视问题,到底哪些是真的?
  20. 张驰咨询:六西格玛常见问题解答

热门文章

  1. 程序纹理应用之静态纹理生成
  2. 常见的浏览器400,403,404,500,502报错解释
  3. 我为什么要开发微信小程序来记录成长锻炼成绩
  4. wordpress搭建:
  5. 《计算机考研-机试指南》- 3数学问题
  6. PHP 正则匹配手机号格式
  7. 华北理工计算机学院官网,CCFCV走进高校
  8. 轻量级在线任务管理工具-DooTask
  9. 00后艺人欧阳娜娜入职阿里巴巴当高管?其实是外包员工啦
  10. python根据时间序列画折线图_Matplotlib:为每个时间序列subp绘制多条线