基于GeoHash算法的地理位置检索

GeoHash算法通过将地球经纬度转换为字符串标识,实现地理位置检索,广泛应用于Lucene/Solr。然而,GeoHash存在突变性和因地球不规则性造成的距离计算误差。相比之下,Morton码(又称Z-Order Curse)通过交叉存储经纬度数据,产生唯一索引,解决了GeoHash的问题。LSQL数据库采用Morton码,提供高性能的地理位置检索,同时支持多值列联合索引,实现多维度轨迹匹配功能。
摘要由CSDN通过智能技术生成

地理位置检索服务在日常生活中随处可见,小到共享单车、高德地图,大到飞行航线轨迹。上述服务中很多相关功能都可以通过GeoHash来实现,Lucene/Solr中也有应用到GeoHash,通过GeoHash创建索引、查询索引以及距离的计算等等。

GeoHash算法本质上是空间索引的一种方式。我们可以将整个地球设想为一个二维平面,将地球上所有区域展开平铺之后通过递归分解将该平面切分为32个模块。之后再将其中的模块再进行分块,随着范围不断缩小,位置精度也越来越高。每个分块都由一定的标识来表示该块。而地球上所有经纬度坐标都会通过GeoHash算法转变为一个唯一的base32标识,该标识对应上述分块的标识,一层一层的确定分块位置,最终便可通过标识找到具体的地理位置。

首先贴出base32编码表:

对于给定的一组经纬度数据(116.389550, 39.928167),使用二分法无限逼近。对纬度39.928167进行编码:

1)区间[-90,0),[0,90],39.928167在右区间内,取1;

2)区间 [0,45),[45,90],39.928167在左区间内,取0;

3)区间 [0,22.5),[22.5,45],39.928167在右区间内,取1;

4)不断递归进行二分拆解,慢慢缩小范围(最多缩小13次)...

5)最终纬度编码为1 1 0 1 0 0 1 0 1 1 0 0 0 1 0;

对经度116.389550做上述操作,可得经度编码1 0 1 1 1 0 0 0 1 1 0 0 0 1 1。

得到经纬度的二进制位后需要对其进行合并。奇数位取纬度,偶数位取经度,每次取其二进制位的一位(不足为取0),最终合并成一个新的二进制串:

11100 11101 00100 01111 0000  01101

每5位为一个10进制数,换算过来为28、29、4、15,0,13 。通过换算过来的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值