geohash基本原理

geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索

目录:

  • 经纬度常识
  • 认识geohash
  • geohash算法
  • geohash原理
  • 对照表

经纬度常识


  • 经线是纵的,经度是横的,用于表示不同的经线,纬线是横的,纬度是纵的,用于表示不同的纬线,如下图
  •   
  • 纬线:地球仪上的横线,lat,赤道是最大的纬线,从赤道开始分为北纬和南纬,都是0-90°,纬线是角度数值,并不是米;
  • 经线:地球仪上的竖线,lng,子午线为0°,分为西经和东经,都是0-180°,经线也是角度数值;
  • 经纬线和米的换算:经度或者纬度0.00001度,约等于1米,这个在GPS测算距离的时候可以体会到,GPS只要精确到小数点后五位,就是10米范围内的精度
  • 经度0度的位置为本初子午线,在180度的位置转为西经,数字由大到小依次经过北美洲到达西欧.纬度0度的位置为赤道
  • 为了便于理解,将地球看成一个基于经纬度线的坐标系。纬线就是平行于赤道平面的那些平面的周线,经线就是连接南北两极的大圆线的半圆弧。纬度分为北纬(正),南纬(负),赤道所在的纬度值为0。经度以本初子午线界(本初子午线经度为0),分为东经(正),西经(负)。故纬度范围可表示为[-90o, 0o),(0o, 90o],经度范围可表示为[-180o, 0o),(0o, 180o]
  • 将经度和纬度看成二维坐标系中的两个纬度,横轴表示经度,纵轴表示纬度,如上图

认识geohash


  • GeoHash将二维的经纬度转换成字符串,比如下图展示了北京9个区域的GeoHash字符串,分别是WX4ER,WX4G2、WX4G3等等,每一个字符串代表了某一矩形区域。也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同的GeoHash字符串,这样既可以保护隐私(只表示大概区域位置而不是具体的点),又比较容易做缓存。
  • 不同的编码长度,表示不同的范围区间,字符串越长,表示的范围越精确
  • 字符串相似的表示距离相近(特殊情况后文阐述),这样可以利用字符串的前缀匹配来查询附近的POI信息。如下两个图所示,一个在城区,一个在郊区,城区的GeoHash字符串之间比较相似,郊区的字符串之间也比较相似,而城区和郊区的GeoHash字符串相似程度要低些
  • 总结:GeoHash就是一种将经纬度转换成字符串的方法,并且使得在大部分情况下,字符串前缀匹配越多的距离越近

geohash算法



以经纬度值:(116.389550, 39.928167)进行算法说明,对纬度39.928167进行逼近编码 (地球纬度区间是[-90,90])

  1. 区间[-90,90]进行二分为[-90,0),[0,90],称为左右区间,可以确定39.928167属于右区间[0,90],给标记为1
  2. 接着将区间[0,90]进行二分为 [0,45),[45,90],可以确定39.928167属于左区间 [0,45),给标记为0
  3. 递归上述过程39.928167总是属于某个区间[a,b]。随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167
  4. 如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,序列的长度跟给定的区间划分次数有关,如下图
  • 同理,地球经度区间是[-180,180],可以对经度116.389550进行编码
  • 通过上述计算,纬度产生的编码为1 1 0 1 0 0 1 0 1 1 0 0 0 1 0,经度产生的编码为1 0 1 1 1 0 0 0 1 1 0 0 0 1 1
  • 合并:偶数位放经度,奇数位放纬度,把2串编码组合生成新串如下图:
  • 首先将11100 11101 00100 01111 0000  01101转成十进制,对应着28、29、4、15,0,13 十进制对应的base32编码就是wx4g0e,如下图
  • ?同理,将编码转换成经纬度的解码算法与之相反

 geohash原理


  • Geohash其实就是将整个地图或者某个分割所得的区域进行一次划分,由于采用的是base32编码方式,即Geohash中的每一个字母或者数字(如wx4g0e中的w)都是由5bits组成(2^5 = 32,base32),这5bits可以有32中不同的组合(0~31),这样我们可以将整个地图区域分为32个区域,通过00000 ~ 11111来标识这32个区域。第一次对地图划分后的情况如下图所示(每个区域中的编号对应于该区域所对应的编码):
  • Geohash的0、1串序列是经度0、1序列和纬度0、1序列中的数字交替进行排列的,偶数位对应的序列为经度序列,奇数位对应的序列为纬度序列,在进行第一次划分时,Geohash0、1序列中的前5个bits(11100),那么这5bits中有3bits是表示经度,2bits表示纬度,所以第一次划分时,是将经度划分成8个区段(2^3 = 8),将纬度划分为4个区段(2^2 = 4),这样就形成了32个区域。如下图
  • 同理,可以按照第一次划分所采用的方式对第一次划分所得的32个区域各自再次划分.

对照表


时间: 2024-12-23 23:38:59

geohash基本原理的相关文章

Geohash精度和原理

转自:https://blog.csdn.net/u011497262/article/details/81210634 https://www.jianshu.com/p/1ecf03293b9a geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索 目录: 经纬度常识 认识geohash geohash算法 geohash原理 对照表 经纬度常识 经线是纵的,经度是横的

基于geohash6编码实现相邻4、9、16网格合并

前面的两篇文章介绍了geohash的基本原理及c#代码相关实现,其中geohash 5位编码单个网格覆盖面积大约在24平方千米,6位编码单网格覆盖面大约在0.73平方千米, 相邻编码长度之间单网格覆盖面积跨度太大,在实际应用中希望计算出3平方千米.5平方千米.10平方千米的覆盖率,可行的方案在Geohash6对应的网格上进行4.9.16网格的合并.    基本思路 : 将城市坐标看成一个基于经纬度线的坐标系,取出所在城市的经纬度范围(为了减少网格的个数,在满足业务的需求的前提下,确定的范围值越小

故障定位之查找附近点GeoHash研讨

随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标:查找附近的XXX,由近到远返回结果,且结果中有与目标点的距离. 针对查找附近的XXX,提出两个方案,如下: 一.方案A:=================================================================================================

一、DNS解析的基本原理

1.基础知识 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析).DNS协议运行在UDP协议之上,使用端口号53. 2.专业术语 FQDN : Full Qualified Domain Name  完全合格域名 例如:www.baidu.com   www.mirrors.163.com

android插件化-apkplug中OSGI服务基本原理-08

我们提供 apkplug 下OSGI使用demo 源码托管地址为 http://git.oschina.net/plug/OSGIService 一 OSGI与android Service 异同点 OSGI服务与android Service概念差不多也是Service ,Client 关系. android Service接口  --service.AIDL OSGI接口                --java interface 所以android 进程间通信Service只能传递序列

使用WIF实现单点登录Part II —— Windows Identity Foundation基本原理

在上一篇文章中,我们已经使用WIF构建了一个基于MVC4的简单的身份验证程序,在这篇文章里,我们将探讨一下到底什么是WIF,以及它的工作原理.然后在下一篇文章开始,我们将实际操作,实现单点登录功能. 身份标识的挑战 在上一篇文章也提及到了,大部分的开发人员并不是安全方面的专家,很多人对于身份验证,授权以及用户体验个性化等工作感觉非常的不爽.传统的计算机技术的课程里通常也不会教这些课题,因此这些东西经常在软件开发周期的后半部分才会凸显出来.当今,一个公司里有数十上百个Web应用程序和服务已不是什么

TCP和UDP基本原理

TCP和UDP基本原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 传输层的主要任务就是建立应用程序间的端到端连接,并且为数据传输提供可靠或不可靠的通信服务,TCP/IP协议族的传输层协议主要包括TCP和UDP ,TCP是面向连接的可靠的传输层协议,它支持在不可靠网络上实现面向连接的可靠的数据传输 ,UDP是无连接的传输协议,主要用于在相对可靠的网络上的数据传输,或用于对延迟较敏感的应用等. 1.传输层的作用 a>.提供面向连接或无连接的服务 b>.维护连接状态 c>

php通过geohash算法实现查找附近的商铺

geohash有以下几个特点: 首先,geohash用一个字符串表示经度和纬度两个坐标.利用geohash,只需在一列上应用索引即可. 其次,geohash表示的并不是一个点,而是一个矩形区域.比如编码wx4g0ec19,它表示的是一个矩形区域. 使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护. 第三,编码的前缀可以表示更大的区域.例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围. 这个特性可以用于附近地点搜索

ZooKeeper基本原理

转自:http://www.cnblogs.com/edison2012/p/5654011.html ZooKeeper简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. ZooKeeper设计目的 1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能. 2.可靠性:具有简单.健壮.良好的性能,如果消息m被到一台服务器接受,那么它将被所