`
hankesi2000
  • 浏览: 97287 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

经纬度搜索(1)-Geohash算法原理

 
阅读更多
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
2
0
分享到:
评论
4 楼 liujiesmart 2012-05-08  
hankesi2000 写道
liujiesmart 写道
geohash 这个字段我配置了 报错
能不能 贴一下你的配置??
lcation 还是挺好用的


<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>

<fieldtype name="geohash" class="solr.GeoHashField"/>

<field name="position" type="location" indexed="true" stored="true"/>
<dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>

谢谢
<field name="geo" type="geohash" indexed="true" stored="true"/>
我原来这么配置 结果是报错的
3 楼 hankesi2000 2012-05-04  
liujiesmart 写道
geohash 这个字段我配置了 报错
能不能 贴一下你的配置??
lcation 还是挺好用的


<fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>

<fieldtype name="geohash" class="solr.GeoHashField"/>

<field name="position" type="location" indexed="true" stored="true"/>
<dynamicField name="*_coordinate"  type="tdouble" indexed="true"  stored="false"/>
2 楼 liujiesmart 2012-05-03  
geohash 这个字段我配置了 报错
能不能 贴一下你的配置??
lcation 还是挺好用的
1 楼 kalman03 2012-01-13  
先顶再说!!!!

相关推荐

    Java实现GeoHash算法

    Java实现GeoHash算法是一种在IT领域中用于地理位置数据存储和检索的技术。GeoHash将经纬度坐标转换为字符串,使得地理位置可以被高效地索引和查询。这种算法利用了空间分割和编码策略,使得相邻的位置在编码后具有...

    geohash算法实现Java代码

    GeoHash算法是一种基于地理坐标的分布式空间索引技术,它通过将地球表面的经纬度坐标转化为可比较的字符串,使得我们可以高效地进行地理位置的搜索、范围查询以及邻居查找等操作。这种算法尤其适用于大数据和分布式...

    GeoHash核心原理解析

    GeoHash是一种将地理坐标(主要是经纬度)转换为一种特定格式字符串的技术,该字符串可以代表一个地理坐标所在的区域,并能够方便地用于地理位置相关的数据处理,例如地理位置索引、空间查询等。GeoHash的字符串长度...

    如何找到周围8个区域的GeoHash编码

    - 在数据库中,可以使用GeoHash编码作为索引来加速地理位置的搜索。当查找附近位置时,只需要查询与目标GeoHash编码相邻的几个编码即可。 - 地图应用中,可以使用GeoHash来对地图进行分块,以优化地图加载和导航...

    geohash:一个解决计算附近距离的php类库.zip

    1. **编码地理位置**:将经纬度转化为Geohash字符串,这一步是将实际的地理位置数据转换为适合存储和查询的形式。 2. **解码Geohash**:将Geohash字符串转换回经纬度,以便获取具体的位置信息。 3. **范围查询**:...

    C/OC_geohash

    Geohash算法主要基于Base32编码,它将地球表面划分为一系列的网格,然后对每个网格进行编码。通过递归地将每个网格分成相等的四部分(北、南、东、西),直到得到的网格足够小,可以接受一个Base32字符来表示。这样...

    geohash-源码.rar

    经纬度坐标首先被归一化到-1到1的范围内,然后进行多次二进制分割,使得经度和纬度分别对应不同的位。 3. 网格的编码: 分割后的每个网格都有一个唯一的二进制表示,然后转换为Base32编码。Base32编码是一种变长...

    geohash-cpp:GeoHash 库

    GeoHash 技术基于二进制的空间分割算法,通过不断将空间划分为相等的区域,然后用二进制位表示这些区域,最终将地理位置转化为字符串。在 C++ 中实现 GeoHash 库可以帮助开发者处理与地理坐标相关的任务,例如存储、...

    共享单车案例

    【共享单车案例】是一个结合了大数据处理和地理位置服务的实战项目,主要涉及了需求分析、GeoHash算法的应用以及数据的获取和存储。以下是该案例中的关键知识点: 1. **需求分析与流程**: - 首先,我们需要理解...

    iOS Geohash.zip

    7. **集成第三方库**:虽然可以手动实现Geohash算法,但也有许多现成的第三方库可供使用,如开源的`GeohashKit`或`SDGeoHash`,它们已经封装了Geohash的处理逻辑,使开发者能更快地集成到项目中。 通过以上知识点,...

    Geohash:GeoHash是当前比较主流实现位置服务的技术,用最简洁的Java实现GeoHash算法

    Geohash GeoHash是目前比较主流的实现位置服务的技术,Geohash算法将通过纬度二维数据编码为一个字符串,本质上是一个降维的过程,一个栗子地点经纬度Geohash鸟巢116.402843,39.999375 wx4g8c9v水立方116.3967,39....

    geohash:用 Java、Lua 和 PHP 编写的用于解码和编码的 Geohash 库

    通过查看和分析这些源代码,开发者可以了解Geohash算法的内部工作原理,也可以根据自身需求进行定制和优化。 总结起来,Geohash是一种有效的地理位置编码技术,可以简化地理数据的处理和存储。Java、Lua和PHP中的...

    Python-Proximity中的Geohash使用Georaptor进行压缩的选项

    Georaptor可能是对原始Geohash算法的一种扩展或增强,旨在减少存储需求,同时保持足够的定位精度。在处理大量地理位置信息时,这种压缩技术尤为重要,因为它可以降低数据库大小,提升查询速度,节省服务器资源。 ...

    Geohash的原理、算法和具体应用探究

    下面我们将深入探讨Geohash的原理、算法及其在实际应用中的价值。 ### 1. Geohash 原理 Geohash的核心思想是通过递归地将地球表面的经纬度网格不断细分,然后用二进制编码来表示每个网格的位置。每个网格的大小在...

    PHP进阶学习之Geo的地图定位算法详解

    GeoHash是一种将经纬度坐标转换为字符串的技术,使得位置可以用一串字符表示,降低了空间搜索的复杂性。GeoHash的关键在于它将地球表面划分为多个网格,并使用Base32编码来表示每个网格。Base32包含32个字符(0-9和b...

    LBS空间搜索架构的优化历程.1c18c6f0-7e53-11e6-831e-83ec0cef607e.pdf

    于是,自研LBS服务成为优化的另一条路径,特别是在使用GeoHash算法的基础上。GeoHash是一种将经纬度坐标转化为可排序、可比较的字符串编码的技术,广泛应用于各种数据库系统,如MongoDB、Lucene/Solr和PostgreSQL/...

    滴滴LBS系统架构实践

    - **编码机制**:介绍Geohash算法的基本原理和应用场景。 - **索引结构**:使用R-tree等数据结构来加速位置信息的查询效率。 - **服务性能**:支持每秒超过3万次查询请求,平均响应时间控制在10毫秒以内。 ##### 五...

    Redis 实现“附近的人”功能

    而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度。 操作命令 自Redis 3.2开始,Redis基于geohash和...

    面向轨迹大数据的压缩空间算法研究.zip

    在轨迹数据中,可能还会应用到特定的空间编码技术,如Geohash或S2几何编码,它们能将经纬度坐标转换为可比较的字符串或数字。 4. **时间序列压缩**:考虑到轨迹数据的时间连续性,可以利用时间序列压缩算法,如差分...

Global site tag (gtag.js) - Google Analytics