首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Geohash算法原理及实现

Geohash算法就是将经纬度编码,将二维变一维,给地址位置分区的一种算法。 基本原理 GeoHash是一种地址编码方法。...geohash算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区 Geohash算法 Geohash算法一共有三步。 首先将经纬度变成二进制。...在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引) GeoHash表示的并不是一个点,而是一个矩形区域 GeoHash编码的前缀可以表示更大的区域。...代码实现 geohash原理清楚后,代码实现就比较简单了。...可以到 http://geohash.co/ 进行geohash编码,以确定自己代码是否写错 整体代码如下所示: public class GeoHash { public static final double

59120
您找到你想要的搜索结果了吗?
是的
没有找到

空间索引-geohash算法实现

算法简介 geohash实现空间索引的一种算法,其他实现空间索引的算法有:R树和其变种GIST树、四叉树、网格索引等 算法基本原理 geohash算法将地球理解为一个二维平面,将平面递归分解成更小的子块...,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索 通过对经纬度的分割,将地球分割成无数的小正方形,每个区域,就是个geohash编码 Geohash...算法实现(php) 以经纬度值:(118.6197800000,24.88849)进行算法说明,对纬度24.88849进行逼近编码 (地球纬度区间是[-90,90]) 纬度区间[-90,90]进行二分为...geohash编码,存入数据库,例如: ?...php扩展 php已经实现了对geohash的扩展, 其他补充 等有时间,将会把geohash解码算法发出来

1.5K20

Geohash算法原理及实现

文章目录 经纬度常识 基本原理 Geohash算法 问题 代码实现 geohash在mysql中的使用 最近需要实现一个功能,查找车辆附近的加油站,如果车和加油站距离在200米以内,则查找成功...geohash算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区 Geohash算法 Geohash算法一共有三步。 首先将经纬度变成二进制。...在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引) GeoHash表示的并不是一个点,而是一个矩形区域 GeoHash编码的前缀可以表示更大的区域。...例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索 GeoHash的精度 ? 编码越长,表示的范围越小,位置也越精确。...代码实现 geohash原理清楚后,代码实现就比较简单了。

1.5K20

GeoHash 经纬度坐标编码与解码算法

内部的实现采用的是GeoHash算法,其实质其实是二分法。...GeoHash 编码特点 1)字符串越长,表示的范围越精确,5位的编码能表示10平方千米范围的矩形区域,而6位编码能表示更精细的区域(约0.34平方千米) ?...GeoHash编码的好处 查询复杂度高,通过计算位置的距离来查询与当前位置距离近的位置计算成本高,采用GeoHash编码后可以将二维坐标点转换为一维数据,进行排序,实现空间索引来进行查找。...GeoHash编码存在的问题 GeoHash 虽然能解决从二维到一维的转变,但也存在一些问题。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。

2.5K20

Geohash原理

GeoHash缺陷 上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。...但是由于Peano曲线实现更加简单,在使用的时候配合一定的解决手段,可以很好的满足大部分需求,因此TD内部Geohash算法采用的是Peano空间填充曲线。 6. 使用注意点 a. ...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。 b. ...GeoHash Base32编码长度与精度。可以看出,当geohash base32编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右,编码长度需要根据数据情况进行选择。 7.

73940

GeoHash索引

GeoHash简介 GeoHash索引是一种基于B树索引,又结合了格网索引的思想的使用广泛的空间索引算法。GeoHash将空间位置编码为一串字符,通过字符串的比较可以得到空间的大致范围。...这种编码方法起初被用于以唯一的URL标识地图上的点实体,而点实体一般是以经纬度标识的,所以问题就转变为如何使用URL标识经纬度坐标。下面举例说明GeoHash编码的具体实现步骤。...(6)对合成的新的二进制串,每五位转成十进制数得到28,25,3,19,12,23,然后再进行Base32编码得到该经纬度的GeoHash编码为wt3mdr。 ?...对于GeoHash索引,需要明确的是:(1)GeoHash编码值表示的并不是一个点,而是一个矩形区域。落在该矩形区域的所有点都可以用该编码表示。(2)字符串越长,表示的范围越精确。...(3)GeoHash将区域划分为一个个规则矩形,位于矩形边界两侧的两点,虽然十分接近,但编码会完全不同,因为它的编码方式从左上到右下突变时存在不连续的“跳跃”。

1.3K30

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

今天要介绍的GeoHash算法实现的空间索引,虽然是以B树实现,但我认为它也借用网格索引的一部分思想。 GeoHash 原理 GeoHash 算法的原理说起来是很简单的,如下图: ?...(原理同base64,可以见我的另一篇文章:WEB开发中的字符集和编码,位编码映射表见下),得到 GeoHash 编码为 3OCO4XJ7; 那么GeoHash编码前缀为 3OCO4XJ7的地理点就是离...如果我们把地理位置点和其GeoHash编码存入数据库的话,我们要查找 附近两米点的点,只需要限定条件 geo_code like '3OCO4XJ7%'就行了; 边界点问题 可是最简版的 GeoHash...Redis的GEO函数 问题 我们常见的需求是查找 n米 范围内的点,那么 n米 与 GeoHash 码位数之间的映射如何实现呢?...主要步骤如下: 代码实现 实现中我将 GeoHash 的最大精度设置为26位,此时它的距离精度为 0.3m。

1.9K90

Geohash之范围搜索

从本质来说,是一个缓冲区分析+空间查找,本文结合Geohash实现类似的功能。 效果 ?...说明: 红色的点和红色的圈是查找的中心点和距离(5km); 蓝色的点+粉色的点是通过geohash查找出来的点; 粉色的点是通过过滤后的点; 实现 本文实现是结合sqlite数据库实现的,实现的思路如下...根据geohash查找点 根据查找的距离范围,先获取geohash的位数,实现方法如下: /** * 获取距离有效位数 * @param radius * @return...if (radius < 630000) result = 2; else result = 0; return result; } 再查找前面的值相同的记录,实现代码如下...计算满足条件的点 由于是经纬度的数据,所以在计算两点距离的时候进行了坐标转换,将经纬度转换为了Web墨卡托,此举是结合geotools实现的。

1.4K40

GeoHash核心原理解析

一、感性认识GeoHash 首先来点感性认识,http://openlocation.org/geohash/geohash-js/ 提供了在地图上显示geohash编码的功能。...三、GeoHash Base32编码长度与精度   下表摘自维基百科:http://en.wikipedia.org/wiki/Geohash   可以看出,当geohash base32编码长度为8时...三、GeoHash算法   上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。   ...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。

1K30

Redis GeoHash核心原理解析

GeoHash Base32编码长度与精度 可以看出,当geohash base32编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右,编码长度需要根据数据情况进行选择。 ?...GeoHash算法 上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。 2....参考 Java实现GPS范围查找 浙大大佬通俗说GPS

1.3K20

GeoHash空间索引算法简述

对于每一个区域最后会得到一个二进制的字符串,然后每5位为一组,用0-9 b-z(去掉a, i, l, o)进行Base32编码即可得到该区域经过编码后的GeoHash值。...不过问题来了,由于GeoHash编码并不能保证查询的点是在他所在区域的中心,这就导致了下图中的问题: 显然,红色的点属于最中间的区域,直接查找该区域会得到他下方的绿色点是最接近的点。...临近点的查找策略: 由于GeoHash对一个坐标点的编码可以有不同的深度(精度),因此在临近点的查找中也就存在了层次的选择策略。...精度 最初Gustavo Niemeyer在定义GeoHash编码的时候是以全球的坐标作为总的区域来分的,因此他计算出了不同编码长度的GeoHash区域对应的范围。...二、拓展性:GeoHash可以与当前的任何一种数据库管理系统结合使用,不仅可以享受数据库的优化,而且还可以利用NoSQL数据库非常轻松的实现分布式存储和查找;R树则一般是在内存中进行查找,虽然现今大多数数据库也有空间索引的引擎

86630

GeoHash原理和可视化显示

最近在做附近定位功能的产品,geohash是一个非常不错的实现方式。查询资料,发现阿里的这篇文章讲解的很好。但文中并没有给出geohash显示的工具。无奈,也没有查到类似的。...收藏原文如下: 基于快速GeoHash,如何实现海量商品与商圈的高效匹配 阿里妹导读:闲鱼是一款闲置物品的交易平台APP。通过这个平台,全国各地“无处安放”的物品能够轻松实现流动。...经过算法改进,我们采用了一种基于GeoHash精确匹配,结合GeoHash非精确匹配并配合小范围几何学关系运算精匹配的算法,大大降低了计算量,高效地实现了离线环境下海量点-面数据的包含关系计算。...面数据GeoHash编码实现 上一节介绍的标准GeoHash算法只能用来计算二维点坐标对应的GeoHash编码,我们的场景中还需要计算面数据(即GIS中的POLYGON多边形对象)对应的GeoHash编码...,需要扩展算法来实现

3.2K20

matlab实现香农编码原理_香农编码c语言实现

最近有个实验是用MATLAB实现香农编码的,在网上看到了别人写的程序,大部分都不支持手动输入信源,我自己就加上了几行,能够直接输入信源分布,下面是程序: pa=input(‘请输入信源分布:’) k=length...w=zeros(k,1); %对二进制矩阵初始化 for m=1:k; %进行香农编码 s(m)=y; y=y+pa(m); b(m)=ceil(-log2(pa...r)=w(r); end disp(‘输出结果为:’); disp(‘初始概率’),disp(pa(m)) disp(‘求和结果’),disp(s(m)) disp(‘编码位数...’),disp(b(m)) disp(‘最终编码’),disp(z’) end sum0=0; sum1=0; for i=1:k %使用for循环进行信息熵、平均码长求解...disp([‘信息熵H(X)=’,num2str(H),'(bit/sign)’]); disp([‘平均码长K=’,num2str(K1),'(bit/sign)’]); disp([‘编码效率=

96740

地理位置计算之geohash算法

地理位置距离实现目标: 最近在做共享单车单车的项目,用户打开APP后,如果根据当前的经纬度坐标获取附近的车辆呢?...特点: geohash用一个字符串表示经度和纬度两个坐标(可以加索引) geohash表示的并不是一个点,而是一个矩形区域 geohash编码的前缀可以表示更大的区域。...,每个区域,就是个geohash编码 geohash其实就是将整个地图或者某个分割所得的区域进行一次划分,由于采用的是base32编码方式,即Geohash中的每一个字母或者数字(如wx4g0e中的w)...Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码 Geohash类 namespace geohash; /** * * Encode and decode...编码 $geohash = new Geohash(); //生成逆地理位置编码 $data['car_geohash'] = $geohash->encode

3.4K10
领券