Redis之GeoHash算法

1、什么是GeoHash算法?

GeoHash是一种地理位置编码方法。 由Gustavo Niemeyer 和 G.M. Morton于2008年发明,它将地理位置编码为一串简短的字母和数字。它是一种分层的空间数据结构,将空间细分为网格形状的桶,这是所谓的z顺序曲线的众多应用之一,通常是空间填充曲线。

2、GeoHash算法在Redis的应用

2.1、查看一下GeoHash的api

使用如下命令:
help @geo
如下图所示:

在这里插入图片描述

2.2、GeoHash的api的使用

进入这个网址可看百度地图坐标
https://api.map.baidu.com/lbsapi/getpoint/index.html

在这里插入图片描述

2.2.1、GEOADD-添加坐标

这条命令的全称是:
GEOADD key longitude latitude member [longitude latitude member …]
作用是往特定的key中加一个地理位置,如果没有这个key,则创建,如果有,则往里面新增。
如下命令
geoadd locations 116.402616 39.923236 gugong 116.404628 39.914271 tiananmen 116.395286 39.932752 beihaigongyuan
如下图显示则代表添加成功

在这里插入图片描述

2.2.2、GEODIST-计算两地之间距离

这条命令的全称是:
GEODIST key member1 member2 [unit]
这条命令的作用是计算两地之间的距离,如下所示:
geodist locations gugong tiananmen km
两地距离1.0118公里

在这里插入图片描述

2.2.3、GEOHASH-获取某个位置的hash值

这条命令的全称是:
GEOHASH key member [member …]
查看某个位置所对应的hash值
hash值的算法在10.2

在这里插入图片描述

2.2.4、GEOPOS-获取某个位置的坐标

这条命令的全称是:
GEOPOS key member [member …]
获取某个地理位置的坐标。
geopos locations gugong tiananmen

在这里插入图片描述

2.2.5、GEORADIUS-给定坐标的范围

这条命令的全称是:
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
给定一个位置,查看某个key中在当前位置的附近的所有位置
georadius locations 116.440848 39.930097 10 km

在这里插入图片描述

2.2.6、GEORADIUSBYMEMBER-只是当前key中元素的范围筛选

这条命令的全称是:
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
在当前key的所有元素中查找范围
GEORADIUSBYMEMBER locations gugong 5 km

在这里插入图片描述

3、GeoHash优缺点

3.1、优点

GeoHash利用Z阶曲线进行编码,Z阶曲线可以将二维所有点都转换成一阶曲线。地理位置坐标点通过编码转化成一维值,利用 有序数据结构如B树、SkipList等,均可进行范围搜索。因此利用GeoHash算法查找邻近点比较快。

3.2、缺点

Z 阶曲线有一个比较严重的问题,虽然有局部保序性,但是它也有突变性。在每个 Z 字母的拐角,都有可能出现顺序的突变。
就比如说我们下图红框中的这两个位置,数值上只差1,但是距离较远。

在这里插入图片描述

10、辅助知识

10.1、GeoHash经纬度编码值计算

我们都知道,经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。
如果以本初子午线、赤道为界,地球可以分成4个部分。
1代表正数,0代表负数。

在这里插入图片描述

如果再往细划分的话,就如下图所示:

在这里插入图片描述

所以,我们在计算一个经纬度编码值的时候,可以是这样的,如下图所示,我们不断的把它划分区间,就会得到一串010101的结果。

在这里插入图片描述

10.2、GeoHash的hash值计算

经过10.1的过程中我们算出了GeoHash的编码值,然后我们将每5位可以整合在一起,使用base32算法根据下图的对应关系,就将它转化为hash值了,5位二进制刚好就是0-31。

在这里插入图片描述

10.3、GeoHash这个坐标需要切分多少次

需要切分52次

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值