geohash作为Solr的位置信息搜索算法,有必要了解其基本的实现原理。geohash算法的wiki链接为
http://en.wikipedia.org/wiki/Geohash,这里再结合自己的理解,重新复述一下。
由经纬度变成base32标识
geohash的思想,是将所有的经纬度坐标,通过geohash,变成一个唯一的base32标识。他将世界上的所有区域进行分块,每个维度都是32块,进而将范围逐渐变小、变小,最后的一堆数字,就成了这个base32的唯一标识。比如说“DRT2Y”这个标识,首先确定D:
OK,找到D区域后,再将D进行分块,精确到DR:
类似的,继续找到DRT:
以此类推,慢慢的精确到你指定的点,这就变成了唯一的base32标识。
base 32的对应表如下:
encode:由经纬度到base32
使用wiki上的例子,纬度为42.6,经度为-5.6的点,转化为base32的话要如何转呢?
拿纬度来进行说明,纬度的范围为-90到90,将这个范围划为两段,则为[-90,0]、[0,90],然后看给定的纬度在哪个范围,在前面的范围的话,就设当前位为0,后面的话值便为1.然后继续将确定的范围1分为2,继续以确定值在前段还是后段来确定bit的值。就这样慢慢的缩小范围,一般最多缩小13次就可以了(经纬度的二进制位相加最多25位,经度13位,纬度12位)。这时的中间值,将跟给定的值最相近。
结合图,看的更明白些:
其中val可以认为是下一次的中间值,而err是误差,通过mid+err=val,err当前值是上一次误差的一半。
这样,取出图中的bit位:1011 1100 1001,同样的方法,将经度(范围-180到180)算出来为
0111 1100 0000 0。
得到了经纬度的二进制位后,下面需要将两者进行结合:从经度、纬度的循环,每次取其二进制的一位(不足位取0),合并为新的二进制数:01101 11111 11000 00100 00010。每5位为一个十进制数,结合base32对应表映射为base32值为:ezs42。这样就完成了encode的过程
decode:由base32到经纬度
相信知道了encode的过程后,decode的过程很容易推导了。不清楚的可以参考wiki。这里就不细说了。
after
接下来,我会写一下Lucene/Solr是如何应用geohash的,包括创建索引、查询索引,以及距离的计算等。
- 大小: 136.6 KB
- 大小: 100.2 KB
- 大小: 100.2 KB
- 大小: 20.5 KB
- 大小: 50.2 KB
分享到:
相关推荐
Java实现GeoHash算法是一种在IT领域中用于地理位置数据存储和检索的技术。GeoHash将经纬度坐标转换为字符串,使得地理位置可以被高效地索引和查询。这种算法利用了空间分割和编码策略,使得相邻的位置在编码后具有...
GeoHash算法是一种基于地理坐标的分布式空间索引技术,它通过将地球表面的经纬度坐标转化为可比较的字符串,使得我们可以高效地进行地理位置的搜索、范围查询以及邻居查找等操作。这种算法尤其适用于大数据和分布式...
GeoHash是一种将地理坐标(主要是经纬度)转换为一种特定格式字符串的技术,该字符串可以代表一个地理坐标所在的区域,并能够方便地用于地理位置相关的数据处理,例如地理位置索引、空间查询等。GeoHash的字符串长度...
- 在数据库中,可以使用GeoHash编码作为索引来加速地理位置的搜索。当查找附近位置时,只需要查询与目标GeoHash编码相邻的几个编码即可。 - 地图应用中,可以使用GeoHash来对地图进行分块,以优化地图加载和导航...
1. **编码地理位置**:将经纬度转化为Geohash字符串,这一步是将实际的地理位置数据转换为适合存储和查询的形式。 2. **解码Geohash**:将Geohash字符串转换回经纬度,以便获取具体的位置信息。 3. **范围查询**:...
Geohash算法主要基于Base32编码,它将地球表面划分为一系列的网格,然后对每个网格进行编码。通过递归地将每个网格分成相等的四部分(北、南、东、西),直到得到的网格足够小,可以接受一个Base32字符来表示。这样...
经纬度坐标首先被归一化到-1到1的范围内,然后进行多次二进制分割,使得经度和纬度分别对应不同的位。 3. 网格的编码: 分割后的每个网格都有一个唯一的二进制表示,然后转换为Base32编码。Base32编码是一种变长...
GeoHash 技术基于二进制的空间分割算法,通过不断将空间划分为相等的区域,然后用二进制位表示这些区域,最终将地理位置转化为字符串。在 C++ 中实现 GeoHash 库可以帮助开发者处理与地理坐标相关的任务,例如存储、...
【共享单车案例】是一个结合了大数据处理和地理位置服务的实战项目,主要涉及了需求分析、GeoHash算法的应用以及数据的获取和存储。以下是该案例中的关键知识点: 1. **需求分析与流程**: - 首先,我们需要理解...
7. **集成第三方库**:虽然可以手动实现Geohash算法,但也有许多现成的第三方库可供使用,如开源的`GeohashKit`或`SDGeoHash`,它们已经封装了Geohash的处理逻辑,使开发者能更快地集成到项目中。 通过以上知识点,...
Geohash GeoHash是目前比较主流的实现位置服务的技术,Geohash算法将通过纬度二维数据编码为一个字符串,本质上是一个降维的过程,一个栗子地点经纬度Geohash鸟巢116.402843,39.999375 wx4g8c9v水立方116.3967,39....
通过查看和分析这些源代码,开发者可以了解Geohash算法的内部工作原理,也可以根据自身需求进行定制和优化。 总结起来,Geohash是一种有效的地理位置编码技术,可以简化地理数据的处理和存储。Java、Lua和PHP中的...
Georaptor可能是对原始Geohash算法的一种扩展或增强,旨在减少存储需求,同时保持足够的定位精度。在处理大量地理位置信息时,这种压缩技术尤为重要,因为它可以降低数据库大小,提升查询速度,节省服务器资源。 ...
下面我们将深入探讨Geohash的原理、算法及其在实际应用中的价值。 ### 1. Geohash 原理 Geohash的核心思想是通过递归地将地球表面的经纬度网格不断细分,然后用二进制编码来表示每个网格的位置。每个网格的大小在...
GeoHash是一种将经纬度坐标转换为字符串的技术,使得位置可以用一串字符表示,降低了空间搜索的复杂性。GeoHash的关键在于它将地球表面划分为多个网格,并使用Base32编码来表示每个网格。Base32包含32个字符(0-9和b...
于是,自研LBS服务成为优化的另一条路径,特别是在使用GeoHash算法的基础上。GeoHash是一种将经纬度坐标转化为可排序、可比较的字符串编码的技术,广泛应用于各种数据库系统,如MongoDB、Lucene/Solr和PostgreSQL/...
- **编码机制**:介绍Geohash算法的基本原理和应用场景。 - **索引结构**:使用R-tree等数据结构来加速位置信息的查询效率。 - **服务性能**:支持每秒超过3万次查询请求,平均响应时间控制在10毫秒以内。 ##### 五...
而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度。 操作命令 自Redis 3.2开始,Redis基于geohash和...
在轨迹数据中,可能还会应用到特定的空间编码技术,如Geohash或S2几何编码,它们能将经纬度坐标转换为可比较的字符串或数字。 4. **时间序列压缩**:考虑到轨迹数据的时间连续性,可以利用时间序列压缩算法,如差分...