综合项目1-05 数仓开发:地理字典构建

本文介绍了数仓开发中如何使用GeoHash编码处理地理位置信息,详细阐述了GeoHash的工作原理,包括GPS坐标到GeoHash字符串的转换过程,并探讨了在Redis中使用GeoHash的方法。此外,还提到了地区编码构建,将原始数据加工为包含GeoHASH码、省、市、区的格式,以优化数据存储。
摘要由CSDN通过智能技术生成

8、数仓开发

8.1 数据预处理:构建地理位置维表

8.1.1 GeoHash位置编码

GPS坐标位置构建:将相邻坐标点转换成一个相同字符串,方便做相邻地理位置查询匹配。

GeoHash编码:即两个坐标的位置越近,这两个坐标的geohash码的相同的位数越多,只有少数的几位尾数不一样。

基本原理:不断将地球上的经度、纬度范围,进行二分,输出1-0比特,开成一串二进制码(二分的次数越多,输出的二进制串越长)

具体实现参考:https://zhuanlan.zhihu.com/p/35940647

Geohash的0、1串序列是经度0、1序列和纬度0、1序列中的数字交替进行排列的,偶数位对应的序列为经度序列,奇数位对应的序列为纬度序列,在进行第一次划分时,Geohash0、1序列中的前5个bits(11100),那么这5bits中有3bits是表示经度,2bits表示纬度,所以第一次划分时,是将经度划分成8个区段(2^3 = 8),将纬度划分为4个区段(2^2 = 4),这样就形成了32个区域(对应Base32)。如下图

GeoHash将每一个区域画成一块块矩形块,每个矩形块使用一个字符串表示,当我们需要查询附近的点时,通过自己的坐标计算出一个字符串,根据这个字符串定位到我们所在的矩形块,然后返回这个矩形块中的点。例如 wx4e就包含wx4e0e,也就是说wx4e0ewx4e范围内 

目前比较通行的做法就是我们不仅获取当前我们所在的矩形区域,还获取周围8个矩形块中的点。那么怎样定位周围8个点呢?关键就是需要获取周围8个点的经纬度,那我们已经知道自己的经纬度,只需要用自己的经纬度减去最小划分单位的经纬度就行。因为我们知道经纬度的范围,有知道需要划分的次数,所以很容易就能计算出最小划分单位的经纬度。

通过上面这张图,我们就能很容易的计算出周围8个点的经纬度了。有了经纬度就能定位到周围8个矩形块了。这样我们就能获取包括自己所在矩形块的9个矩形块中的所有的点。最后分别计算这些点和自己的距离(由于范围很小,点的数量就也很少,计算量就很少)过滤掉不满足条件的点就行了。
 

试想一下,我们打开百度地图或者是百度地图,在页面中,我们可以看到一个以自我为中心单位范围的一个,之前我一直有疑惑,觉得GeoHash应该是已圆为范围,半径为单位进行搜索附近的标志。那么,在实际开发中,会不会地图上显示的圆,仅仅是一种参考,以表示自己周围范围内的标志,而在代码计算中,依旧是已矩形形式来计算的呢? 这个问题,希望我可以在后面进一步的学习和深入了解相关地图API后得到解答。

 

附上GeoHash字符串对应地图精度参考图

对了,Redis支持Geo,可查看Redis操作文档API(http://redisdoc.com/geo/geohash.html)

在Redis3.2之后引入的。

 

具体算法: 

常营地铁站(lat:39.9257460000,lng:116.5998310000)

将其按geohash拆分规律拆分后的二进制值应该为

11100 11101 00100 01111 10001 10010 00011 00010 01110 10111 11101

转成10进制得到28 29 4 15 17 18 3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pub.ryan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值