注:全文转载自:Geohash算法原理及实现 - 简书 (jianshu.com)

Geohash 算法就是将经纬度编码由二维变一维,给地址位置分区的一种算法。

一、基本原理

GeoHash 是一种地址编码方法。它能够把二维的空间经纬度数据编码成一个字符串。

我们知道,经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。如果以本初子午线、赤道为界,地球可以分成4个部分。

如果纬度范围[-90°, 0°)用二进制0代表,(0°, 90°]用二进制1代表,经度范围[-180°, 0°)用二进制0代表,(0°, 180°]用二进制1代表,那么地球可以分成如下4个部分。

如果在小块范围内递归对半划分呢?

可以看到,划分的区域更多了,也更精确了。GeoHash 算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区。

二、GeoHash 算法

GeoHash 算法一共有三步。

1、首先将经纬度变成二进制

比如这样一个点(39.923201, 116.390705)

纬度的范围是(-90,90),其中间值为0。对于纬度39.923201,在区间(0,90)中,因此得到一个1;(0,90)区间的中间值为45度,纬度39.923201小于45,因此得到一个0,依次计算下去,即可得到纬度的二进制表示,如下表:

最后得到纬度的二进制表示为:

10111000110001111001

同理可以得到经度116.390705的二进制表示为:

11010010110001000100

2、将经纬度合并

经度占偶数位,纬度占奇数位,注意,0也是偶数位。

11100 11101 00100 01111 00000 01101 01011 00001

3、按照Base32进行编码

Base32编码表的其中一种如下,是用0-9、b-z(去掉a, i, l, o)这32个字母进行编码。具体操作是先将上一步得到的合并后二进制转换为10进制数据,然后对应生成Base32码。需要注意的是,将5个二进制位转换成一个base32码。上例最终得到的值为

wx4g0ec1

Geohash比直接用经纬度的高效很多,而且使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。

  • GeoHash用一个字符串表示经度和纬度两个坐标。在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引)

  • GeoHash表示的并不是一个点,而是一个矩形区域

  • GeoHash编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索

编码越长,表示的范围越小,位置也越精确。因此我们就可以通过比较GeoHash匹配的位数来判断两个点之间的大概距离。

Geohash:算法原理相关推荐

  1. geohash算法原理及实现方式

    原文地址为: geohash算法原理及实现方式 1.geohash特点 2.geohash原理 3.geohash的php .python.java.C#实现代码 4.观点讨论 w微博:http:// ...

  2. [990]Geohash算法原理及实现

    文章目录 经纬度常识 基本原理 Geohash算法 GeoHash的精度 具体的计算方法 1.纬度相同,经度不同 2.经度相同,纬度不同 问题 代码实现 geohash在mysql中的使用 最近需要实 ...

  3. Geohash算法原理及实现

    最近需要实现一个功能,查找车辆附近的加油站,如果车和加油站距离在200米以内,则查找成功. 加油站数量肯定不小,能否缩小查找范围,否则以遍历形式,效率肯定高不了. Geohash算法就是将经纬度编码, ...

  4. geohash java github_GitHub - GongDexing/Geohash: GeoHash是目前比较主流实现位置服务的技术,用最简洁的Java实现GeoHash算法...

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

  5. 空间索引 - GeoHash算法及其实现优化

    转自原文 空间索引 - GeoHash算法及其实现优化 上篇博客中提到了空间索引的用途和多种数据库对空间索引的支持情况,那么在应用层以下,好学的小伙伴应该会考虑空间索引的实现原理了. 目前空间索引的实 ...

  6. 周围的餐馆有哪些?GeoHash算法

    来源:http://t.cn/EbMSD2A geohash-feature 当今年代,每个人都有智能手机,出门在外,自然离不开使用手机地图了,查找附近的餐馆,附近的地铁站,非常方便,可是在这项技术背 ...

  7. java geohash_GitHub - GongDexing/Geohash: GeoHash是目前比较主流实现位置服务的技术,用最简洁的Java实现GeoHash算法...

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

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

    地理位置检索服务在日常生活中随处可见,小到共享单车.高德地图,大到飞行航线轨迹.上述服务中很多相关功能都可以通过GeoHash来实现,Lucene/Solr中也有应用到GeoHash,通过GeoHas ...

  9. GeoHash算法获取附近店铺和距离

    1. 简介 GeoHash算法将二维经纬度坐标直接转换成字符串,每一个字符串代表一个矩形区域,也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串,字符串的长度越大,矩形的区 ...

最新文章

  1. 认知AI的兴起:2025年AI将会发生质的飞跃
  2. FFmpeg被声明为已否决的解决方案
  3. IDE安装Lombok插件提高开发效率
  4. JavaFX 中的像素、分辨率与缩放比
  5. redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?
  6. Echarts五步法加初体验
  7. python中读取指定的行和列_Python怎么获取excle中指定行和列的值?
  8. 面试精讲之面试考点及大厂真题 - 分布式专栏 23 分布式系统下分布式锁的实现
  9. 学Python可以用来干什么?就业情况究竟怎么样?
  10. python 中time, datetime的用法
  11. 绘制网络组建拓扑图方法分享
  12. python 基于xgboost预测波士顿房价
  13. 软件测试经典面试题之二
  14. 国外免费3D模型下载网站
  15. # [解构如何运用的解构--报错 throw new TypeError(‘Router.use() requires a middleware function but got a ‘ + gett
  16. OpenLayers中文文档2栅格重投影
  17. Milvus 社区周报- Week 12, 2020
  18. IT大败局----第十一章 科技虚幻的诱惑
  19. Conv2d和Conv3d详解
  20. 申万一级行业日指数_本周表现较好的申万一级行业指数

热门文章

  1. 第四章 FPGA 开发平台介绍
  2. JavaScript弹出对话框的三种方式-alert()-confirm()-prompt()
  3. 32 岁还能转行做程序员吗?
  4. abcde依次进入一个队列_一个队列的入队序列为:abcde,则队列的出队序列是( )。
  5. PhotoJet彩信图片智能自适应系统
  6. 基于Java+Springboot+Vue的校园爱心捐赠互助管理系统设计和实现
  7. 测试管理杂谈之理论篇(转)
  8. 计算机学院新生入学致辞,计算机科学与技术学院召开迎新大会 欢迎14级新生入学...
  9. 腾讯: 可视化, 低代码生成器,正式开源!
  10. 在IFrame中通过P3Pheader来启用Cookies