Redis高级特性(二)-GEO地理信息定位

1.GEO

Redis3.2提供了GEO(地理信息定位)功能,支持地理位置信息并以存储后的信息实现诸如附近位置、摇一摇这类依赖与地理位置的功能。GEO功能是借鉴国人开发的NoSQL数据库Ardb实现的。

1.1 增加地理位置

geoadd cities:china 116.28 39.55 beijing

cities:china key

116.28 经度

39.55 维度

beijing 成员名称

geoadd cities:china 76.28 39.55 A 86.28 39.55 B 96.28 39.55 C 66.28 39.55 D

geoadd 支持复数的地理信息进行新增

geoadd cities:china 16.28 39.55 beijing 

如果更新的话输入对应的成员名称 修改经纬度就可以 

1.2 获取地理位置信息

geopos cities:china beijing
116.28000229597091675
39.5500007245470826

1.3 获取两个地理位置距离

geodist cities:china tianjin beijing m

m是返回结果单位,包含以下四种:

m:米(默认)

km:公里

mi:英里

ft:尺

1.4 获取指定位置范围内的地理信息位置集合

georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

georadius cities:china 116 39 1000 km

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。自3.2版本就可以使用。
 

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

georadiusbymenber cities:china beijing 1000 km

georadiusbymember 的中心点是由给定的位置元素,与中心的距离不超过给定最大距离的所有位置元素。直到4.0版本才可以使用。

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。

WITHCOORD: 将位置元素的经度和维度也一并返回。

WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

COUNT 限定返回的记录数。

ASC: 查找结果根据距离从近到远排序。

DESC: 查找结果根据从远到近排序。

STORE key 将返回结果的地理位置信息保存到指定的键。

STOREDIST key 将返回结果离中心节点的距离保存到指定键。

2.GEO的实现

估计有读者会说GEO不是还有一个geohash命令吗,为什么我在上面没有写入,因为geohash他除了是一个命令以外,它也关系着GEO这个功能的实现,所以我新开一个小节进行阐述。

2.1 什么是Geohash

Geohash is a public domain geocode system invented in 2008 by Gustavo Niemeyer[1] and (similar work in 1966) G.M. Morton,[2] which encodes a geographic location into a short string of letters and digits. It is a hierarchical spatial data structure which subdivides space into buckets of grid shape, which is one of the many applications of what is known as a Z-order curve, and generally space-filling curves.

                                                                                                                                                                                                                -- wiki

 Geohash是一个地理编码系统,通过数字和字母来对地理位置进行编码。两个geohash之间共享前缀越长,大多数情况下证明他们在空间上就越来越接近。

Redis高级特性(二)-GEO地理信息定位_第1张图片

2.2 Geohash实现原理

Geohash通过两步来实现经综度向字符串的转换。第一步是空间二分无限逼近,第二步是Base32字符编码。

(1)空间二分。Geohash通过将空间范围按照经度和绨度方向不断地交替进行二分,直到划分后的空间足够小,以满足空间的精度要求。

Redis高级特性(二)-GEO地理信息定位_第2张图片

 (2)字符编码。为了进一步对Geohash编码长度进行压缩,采用Base32编码将每5位二进制编码转为一个字符。需要注意的是Geohash采用的并不是应用最广泛的RFC4648Base32编码。差别在于排除了字符I、L、O、a,以避免与数字的混淆。

Redis高级特性(二)-GEO地理信息定位_第3张图片

 2.3 计算Geohash

广州的地理位置 经度:113.27 维度:23.13

经度:

Redis高级特性(二)-GEO地理信息定位_第4张图片

 

 

维度:

Redis高级特性(二)-GEO地理信息定位_第5张图片

 

 

经度:110100010

维度:101000011

偶数位放经度,奇数位放纬度,把2串编码组合生成字符串:11100110000000001101

首先对字符串以5个位进行分组11100  11000 00000 01101,并计算出对应十进制结果28 24 0 13

根据对照表进行转换,最后得到ws0e。

2.4 Redis中的Geohash

1.获取Geohash

geohash cities:china guangzhou

2.删除Geohash

zrem cities:china guangzhou

我们知道GEO的底层实现是zset,所以可以使用zrem命令来实现对地理位置信息的删除

引用:https://www.runoob.com/redis/redis-geo.html

https://en.wikipedia.org/wiki/Geohash

论文:条带状公路运营管理空间大数据降维组织及混合存储关键技术研究

书籍:《Redis开发与运维》

演示:https://ryan-miao.gitee.io/geohash_tool/

你可能感兴趣的:(Redis,java)