GeoHash学习笔记

核心思想

将二维数据转换为一维数据,使用B树索引;二分法;Peano空间填充曲线。

Base32编码

Base系列:字节编码为 ASCII 中的可见字符;Base32编码将字节编码为 ASCII 中的可见字符将字节切为 5 个一组,每 5 个字节可以重组为 8 个字符。如果不够 5 个字节,那么就在切出的最后一组后边充 0,充够 5 位,然后右边充 =,充够 8组。(最后一组补0,组数不够补=)

例如: 5个字节:00000001 00000011 00000111 00001111 00011111 ==> 00000 00100 00001 10000 01110 00011 11000 11111 每5个一组,重组为8组,每组对应一个字符,转换为十进制:0、4、1、16、14、3、24、31 ,查字母方案表得到对应的字符串:AEBQODY7(Base32 编码字符序列有两种方案,一种是字母方案,另一种是扩展十六进制的字母方案。)
在这里插入图片描述

GeoHash算法步骤

经纬度一般精确到小数点后6位。

步骤1:根据经纬度计算GeoHash二进制编码

经度区间为[-180,180];纬度区间为[-90,90];根据给出的经纬度不断在经度区间和纬度区间不断进行二分细化,左区间取0,右区间取1;最终得到GeoHash二进制编码

例如:北海公园的纬度是39.928167,经度116.389550
在这里插入图片描述
在这里插入图片描述

由上图可得,纬度编码:1011100011;经度1101001011;此处可以看出,二进制编码前缀匹配度越高,说明两个地理位置的纬度或者经度越接近。

步骤2:组码

采用偶数位放经度,奇数位放纬度策略,将经纬度编码组合成新的二进制编码:11100 11101 00100 01111,转换成十进制:28、29、4、15;查表对应的字符串为:wx4g,解码反之。可见,字符串越长,精度越高,定位越准确。
在这里插入图片描述

GeoHash算法

个人理解:

1.为什么要将经纬度编码:将经纬度进行二进制编码,通过字符串前缀匹配即可判断两个坐标经度或者纬度是否在一个区间,从而预估两者的距离范围(不考虑边界因素)。(分别判断)

2.为什么要使用组码:因为经度和纬度不是独立的,两个坐标只有经纬度都在同一区间,两者之间的距离才是相近的。(整体判断)

Peano空间填充曲线:
在这里插入图片描述
由上图可见,01跟00有相同的纬度区间,01跟11有相同的经度区间,01跟10经纬度都不在同一个区间,所以两个坐标的距离最远。

同理,经纬度精度提高后:(当前缀不匹配时,不考虑区间边界因素,后续的匹配失去意义)
在这里插入图片描述

同时,结合实际情况,考虑到区间边界因素,不在同一个区间的两个坐标距离也可能是相近的,所以一般在POI召回时,一般不止是召回同区间的商家,还会同时召回周围八个区间的商家。

运用

计算商家的GeoHash二进制编码,在对应的Hash桶缓存商家信息,当有请求到达,计算请求坐标的Hash值,召回对应Hash桶的商家,同时召回周围八个区间的商家。

参考资料
GeoHash核心原理解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值