GeoHash

GeoHash

Geohash is a latitude/longitude geocode system invented by Gustavo Niemeyer when writing the web service at geohash.org, and put into the public domain. It is a hierarchical spatial data structure which subdivides space into buckets of grid shape.

简单说,GeoHash是一个将经纬度信息编码成一个string的算法。从而便于储存、查找。

GeoHash算法的步骤

GeoHash对经度纬度分别编码,原理是迭代做二分,进而逼近真实值。

我们以纬度举例。

由于地球纬度区间是[-90,90],所以取区间中点pivot。如果某地点P的纬度大于pivot的值,则编码的第1位为1,反之为0

然后缩小范围,迭代N次。得到最后的结果。

经度的范围是[-180, 180]。我们重复上面的过程,也可以得到经度编码。

最后我们把经度和纬度的编码进行交错组合,偶数位放经度,奇数位放纬度。得到最后的GeoHash编码。

例如,经纬度(57.64911,10.40744)可以使用base32编码为 u4pruydqqvj

GeoHash算法的用途

由于GeoHash使用经纬度交错编码,所以我们使用某一个前辍,就可以划定一个经纬度范围。

如果我们对GeoHash编码这一列进行索引加速,则可以在较快的时间内查找到某一个范围内的所有grid,进而获得POI等信息。

GeoHash的压缩思想

GeoHash的交错编码为区间查找提供了遍历。而对经纬度的逼近编码则提供了非常好的压缩特性。

易得,一个点位于pivot的左右/上下的机率是相同的。所以编码的每一位的信息量都是-logPr[s]=>1bit,达到了数据压缩的下限。

又由于二分逼近的良好性能,使得压缩/解压缩的速度可以达到极限。

不过在实际应用中,POI不可能完全平均分布,所以GeoHash的压缩只是一种接近最优解的方案。但是由于二分逼近法带来的可索引性,GeoHash绝对可以称的上是一个精妙完美的设计了。

应用 - 拉取目标周围的POI

我们在一些LBS应用中,经常需要拉取某一点周围的POI。

假设我们将POI存储为一个pvlist映射。并且获得了某点的GeoHash值。那么我们怎么取得周围的POI呢?

理想状态下,“附近的POI”都是在一个以某点为圆心的圆进行查找。但是由于GeoHash划分的范围是一个矩形,所以我们使用一个3×3的大矩形来替代圆形范围。

其中3×3矩形中最中间的矩形是我们确定的那个点。

然后,我们根据给出的半径r确定GeoHash的精确度。使得我们的3×3大矩形可以包含理想的圆形范围。

于是下一步的目标就是找到某点GeoHash的8个临近的GeoHash。

由上文我们可以得出,GeoHash的经纬度是分别编码的。以一个4×4的地图为例。

这是在纬度上的划分。

可以看出,连续的GeoHash Grid的纬度编码也是连续的。

经度同理。

所以我们只需要decode我们的GeoHash编码,将longitudelatitude编码分别进行-1/+1的操作就可以获得附近的POI的GeoHash码/前辍了。

总结

GeoHash的三个特性,可索引,压缩,便于存储。

还有,好久不写文了。

参考资料


Comments

comments powered by Disqus

from:http://wizmann.tk/geo-hash-algorithm.html

时间: 2024-10-13 04:21:28

GeoHash的相关文章

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

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

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

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

LBS地理位置距离计算方法之geohash算法

随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等).基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近.这里需要在设置出一个字段,是关于编码的字段,一会看下文哈…… 地理位置距离实现目标:查找附近多少公里内的人或者商家 比如:微信.陌陌.美团.基于O2O的一些APP这些应用或者移动网页都需要用到地理位置计算 目前来说:移动地理位置距离计算比较好的算法是geohash,特此整理分享. geohash有以下几个特点: 第一:geo

GeoHash解析及java实现

GeoHash解析请参考这里: http://www.open-open.com/lib/view/open1417940079964.html java实现GeoHash,代码已注释. import java.util.BitSet; import java.util.HashMap; /** * 地理知识补充: Latitude(纬度)[-90, 90],Longitude(经度)[-180, 180] * * @author FengKang 2014-10-03 * */ public

geohash基本原理

geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索 目录: 经纬度常识 认识geohash geohash算法 geohash原理 对照表 经纬度常识 经线是纵的,经度是横的,用于表示不同的经线,纬线是横的,纬度是纵的,用于表示不同的纬线,如下图    纬线:地球仪上的横线,lat,赤道是最大的纬线,从赤道开始分为北纬和南纬,都是0-90°,纬线是角度数值,并不是米: 经

查找附近点--Geohash方案讨论

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

GeoHash核心原理解析 - OPEN 开发经验库

阅读目录 引子 一.感性认识GeoHash 二.GeoHash算法的步骤 三.GeoHash Base32编码长度与精度 三.GeoHash算法 四.使用注意点 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中一家用餐. 饭饱之后机机开始反思了,地图后台如何根据自己所在位置查询来查询附近餐馆的呢?苦思冥想了半天,机机想出了个方法:计算所在位置P与北京所有餐馆 的距离,然

TX2017秋招笔试题之geohash编码

问题描述:geohash编码:geohash常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二步是base32转码. 此题考察纬度的二进制编码:算法对纬度[-90, 90]通过二分法进行无限逼近(取决于所需精度,本题精度为6). 注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间.算法举例如下: 针对纬度为80进行二进制编码过程: 1) 区间[-90, 90]进行二分为[-90, 0),[0, 90],成为左右区间,可以确定80为右区间,标

pip install geohash后无法import的解决方法

最近在参加摩拜杯数据挖掘比赛,赛方给的数据里地理位置是用geohash表示的,因此需要安装geohash库进行解析 pip install geohash可以直接安装这个库,可是装好之后import geohash却报错 在网上找了半天,最后解决办法是去python35/Lib/site-packages/目录下,把Geohash文件夹重命名为geohash,然后修改该目录下的__init__.py文件,把from geohash改为from .geohash 然后解决问题

附近的人,附近的卖家(geohash+前缀树)

http://www.cnblogs.com/LBSer/p/3310455.html http://blog.csdn.net/shixiaoguo90/article/details/25313717 MongoDB 中使用geohash  实现地理位置索引 引子 机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西.某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中一家用餐. 饭饱之后机机开始反思了,地图后台如何根据自己所在