) { $data = array(); $combination_str = self::geohash_decode($geohash); $...LONGITUDE],1,self::get_interval_value(self::LONGITUDE)); return $data; } /** * 编码... $encode_str .= self::BASE32[$decimal]; } return $encode_str; } /** * 编码... = Geohash::encode(24.88849, 118.6197800000); echo $geohash . ..."\n"; var_dump(Geohash::decode($geohash)); 输出: ?
GeoHash 原理 将二维的经纬度坐标点转换为一维的字符串,也就是编码,某一个字符串表示了某一个矩形区域,也就是说在这个矩形区域中的所有经纬度点都共享一套编码也就是字符串。...GeoHash 编码特点 1)字符串越长,表示的范围越精确,5位的编码能表示10平方千米范围的矩形区域,而6位编码能表示更精细的区域(约0.34平方千米) ?...GeoHash编码的好处 查询复杂度高,通过计算位置的距离来查询与当前位置距离近的位置计算成本高,采用GeoHash编码后可以将二维坐标点转换为一维数据,进行排序,实现空间索引来进行查找。...GeoHash编码存在的问题 GeoHash 虽然能解决从二维到一维的转变,但也存在一些问题。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。
GeoHash缺陷 上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。 b. ...GeoHash Base32编码长度与精度。可以看出,当geohash base32编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右,编码长度需要根据数据情况进行选择。 7. ...计算围栏内所有Geohash 理解了geohash算法的基本原理之后,本节将介绍一个实际应用中常见的场景:计算围栏范围内所有的Geohash编码。
GeoHash简介 GeoHash索引是一种基于B树索引,又结合了格网索引的思想的使用广泛的空间索引算法。GeoHash将空间位置编码为一串字符,通过字符串的比较可以得到空间的大致范围。...这种编码方法起初被用于以唯一的URL标识地图上的点实体,而点实体一般是以经纬度标识的,所以问题就转变为如何使用URL标识经纬度坐标。下面举例说明GeoHash编码的具体实现步骤。...(6)对合成的新的二进制串,每五位转成十进制数得到28,25,3,19,12,23,然后再进行Base32编码得到该经纬度的GeoHash编码为wt3mdr。 ?...对于GeoHash索引,需要明确的是:(1)GeoHash编码值表示的并不是一个点,而是一个矩形区域。落在该矩形区域的所有点都可以用该编码表示。(2)字符串越长,表示的范围越精确。...(3)GeoHash将区域划分为一个个规则矩形,位于矩形边界两侧的两点,虽然十分接近,但编码会完全不同,因为它的编码方式从左上到右下突变时存在不连续的“跳跃”。
Geohash算法就是将经纬度编码,将二维变一维,给地址位置分区的一种算法。 基本原理 GeoHash是一种地址编码方法。...geohash算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区 Geohash算法 Geohash算法一共有三步。 首先将经纬度变成二进制。...在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引) GeoHash表示的并不是一个点,而是一个矩形区域 GeoHash编码的前缀可以表示更大的区域。...可以到 http://geohash.co/ 进行geohash编码,以确定自己代码是否写错 整体代码如下所示: public class GeoHash { public static final double...; // System.out.println(geo[0]+" "+geo[1]); } } 参考地址:geohash 经纬度地址编码 Base32编码 发布者:全栈程序员栈长,转载请注明出处
从本质来说,是一个缓冲区分析+空间查找,本文结合Geohash来实现类似的功能。 效果 ?...根据geohash查找点 根据查找的距离范围,先获取geohash的位数,实现方法如下: /** * 获取距离有效位数 * @param radius * @return..., String geohash2){ Map lonlat1 = decode(geohash1), lonlat2 = decode(geohash2);...= map.get("geohash").toString(); double _dist = geoHash.distance(strGeohash, _geohash);...= map.get("geohash").toString(); double _dist = geoHash.distance(strGeohash, _geohash);
Geohash是一个可以对地理位置信息进行加密和解密的系统,https://en.wikipedia.org/wiki/Geohash Python安装geohash库后,可调用decode()和encode...按照一般的步骤进行安装pip install geohash,在确认安装成功后,import Geohash 仍然报错: ImportError: No module named ‘geohash’,...说找不到Geohash模块。.../#python-geohash 解决方法2 1、将Geohash文件夹改成geohash; 2、将文件夹下的 __init__.py 中的 from geohash 改成 from .geohash(...注意:在geohash前面多了一个点) 简单使用 # from geohash import decode_exactly, decode, encode import geohash # 原始数据提供的
,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索 通过对经纬度的分割,将地球分割成无数的小正方形,每个区域,就是个geohash编码 Geohash...其实就是将整个地图或者某个分割所得的区域进行一次划分,由于采用的是base32编码方式,即Geohash中的每一个字母或者数字(如wx4g0e中的w)都是由5bits组成(2^5 = 32,base32...第一次对地图划分后的情况如下图所示(每个区域中的编号对应于该区域所对应的编码): 如图: ?...geohash编码,存入数据库,例如: ?...php扩展 php已经实现了对geohash的扩展, 其他补充 等有时间,将会把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编码,这样可以避免这个问题。
geohash geohash是什么? 这个可以自行了解一下,在这里我就不做介绍了。 这篇推送的来源 昨天有个朋友在我的技术交流群里问,如何将geohash进行解码,变成经纬度?...造数据的逻辑 首先加载含有xy的数据,使用Python的geohash包进行encode处理。encode后的数据写出到文本中供FME使用。 处理 依然来一张胜千言的图吧! ?...从图中可以看到,FME支持Geohash这种数据格式。读取这种格式后,FME可以直接把它当成了矢量要素,XY信息也都得出来了,用户可以根据自己的需要写成各种需要的格式,非常方便。
Geohash算法就是将经纬度编码,将二维变一维,给地址位置分区的一种算法。 经纬度常识 经线是纵的,经度是横的,用于表示不同的经线,纬线是横的,纬度是纵的,用于表示不同的纬线,如下图 ? ?...geohash算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区 Geohash算法 Geohash算法一共有三步。 首先将经纬度变成二进制。...在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引) GeoHash表示的并不是一个点,而是一个矩形区域 GeoHash编码的前缀可以表示更大的区域。...例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索 GeoHash的精度 ? 编码越长,表示的范围越小,位置也越精确。...可以到 http://geohash.co/ 进行geohash编码,以确定自己代码是否写错 整体代码如下所示: public class GeoHash { public static final double
对于每一个区域最后会得到一个二进制的字符串,然后每5位为一组,用0-9 b-z(去掉a, i, l, o)进行Base32编码即可得到该区域经过编码后的GeoHash值。...不过问题来了,由于GeoHash编码并不能保证查询的点是在他所在区域的中心,这就导致了下图中的问题: 显然,红色的点属于最中间的区域,直接查找该区域会得到他下方的绿色点是最接近的点。...临近点的查找策略: 由于GeoHash对一个坐标点的编码可以有不同的深度(精度),因此在临近点的查找中也就存在了层次的选择策略。...如果b小于k,那么就把精度提高一层(即将其GeoHash编码末尾的几个字符删除)继续执行邻居查找算法直到找到的临近点的个数大于等于k; 用邻居查找算法查询当前精度下的所有临近点并将其作为”Filter”...精度 最初Gustavo Niemeyer在定义GeoHash编码的时候是以全球的坐标作为总的区域来分的,因此他计算出了不同编码长度的GeoHash区域对应的范围。
GeoHash Base32编码长度与精度 可以看出,当geohash base32编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右,编码长度需要根据数据情况进行选择。 ?...GeoHash算法 上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。...GeoHash编码与我们一样(因为在同一个GeoHash区域块上),而较近餐馆的GeoHash编码与我们不一致。...解决的思路很简单,我们查询时,除了使用定位点的GeoHash编码进行匹配外,还使用周围8个区域的GeoHash编码,这样可以避免这个问题。 2....注意点 我们已经知道现有的GeoHash算法使用的是Peano空间填充曲线,这种曲线会产生突变,造成了编码虽然相似但距离可能相差很大的问题,因此在查询附近餐馆时候,首先筛选GeoHash编码相似的POI
面数据GeoHash编码实现 上一节介绍的标准GeoHash算法只能用来计算二维点坐标对应的GeoHash编码,我们的场景中还需要计算面数据(即GIS中的POLYGON多边形对象)对应的GeoHash编码...算法思路是,先找到目标Polygon的最小外接矩形MBR,计算此MBR西南角坐标对应的GeoHash编码。然后用GeoHash编码的逆算法,反解出此编码对应的矩形GeoHash块。...传统的做法是,根据当前GeoHash块的反解信息,求出相邻块内部的一点,在对这个点做GeoHash编码,即为相邻块的GeoHash编码。...通过观察GeoHash编码表的规律,结合GeoHash编码使用的Z阶曲线的特性,验证了一种通过查表来快速求相邻GeoHash字符串的方法。...商品3的点数据GeoHash编码与面数据的任何GeoHash块编码都匹配不上,所以可以快速确定商品3不属于此面数据。 ?
特点: geohash用一个字符串表示经度和纬度两个坐标(可以加索引) geohash表示的并不是一个点,而是一个矩形区域 geohash编码的前缀可以表示更大的区域。...,每个区域,就是个geohash编码 geohash其实就是将整个地图或者某个分割所得的区域进行一次划分,由于采用的是base32编码方式,即Geohash中的每一个字母或者数字(如wx4g0e中的w)...Geohash的最简单的解释就是:将一个经纬度信息,转换成一个可以排序,可以比较的字符串编码 Geohash类 namespace geohash; /** * * Encode and decode...geohashes * 编码和解码地理数据 * Find neighbors * 寻找邻居 */ class Geohash { private $bitss = array(16, 8...编码 $geohash = new Geohash(); //生成逆地理位置编码 $data['car_geohash'] = $geohash->encode
方法一:pip3 install python-geohash 方法二: 1.安装 pip3 install geohash 2.进入包的下载目录 /usr/local/lib/python3.5/...dist-packages 3.mv Geohash geohash 4.cd geohash 修改__init__.py文件from geohash import decode_exactly, decode..., encode 修改为:from .geohash import decode_exactly, decode, encode
Geohash算法 地图上一般是使用经度和纬度两个维度来唯一的确定一个点,而geohash采用经纬度二维值转为一维的值。 ...使用long型值,更细粒度的精度控制 首先说明下,标准的geohash值,是采用base32编码的字符串作为值,每一字符代表5个bit位。也就是精度多一位字符就多出了5个bit位。...length代表的是标准geohash算法中的字符长度,可以看出当geohash的长度为8时,误差(km error)为19米,当长度为7时,误差为76米,当长度为6时,误差为610米,可以看出随着geohash...这里的误差其实只是个大概的数量级,代表的是geohash对应的矩形区域的对角线长度的二分之一。 ...我的需求对应区域的大小控制需要更精确,我希望我通过缩短geohash一位不至于导致区域增大过快,所以我这里采用geohash的二进制转成64位long型值作为geohash值。高位为有效位,低位补0。
在创建索引时,MongoDB会将位置数据转换为二进制 geohash值,并使用位置数据和索引的位置范围计算这些值,如 位置范围中所述。..., { min: , max: } ) 位置精度 2d索引在 内部使用所有坐标数据的 geohash...Geohash值 要创建地理空间索引,MongoDB会计算 指定范围内坐标对的geohash值,并为该点的地理散列编制索引。 要计算geohash值,请连续将2D地图划分为象限。...左上象限将具有01的geohash 。右下角和右上角的分别为10 和11。 为了提供更高的精度,继续将每个象限划分为子象限。每个子象限都将包含象限的地理哈希值与子象限的值连接起来。...要计算更精确的geohash,请继续划分子象限并连接每个分区的两位标识符。给定点的散列标识符中的“比特”越多,散列可以描述的可能区域越小,地理空间索引的分辨率越高。
关于什么是Geohash可以参考这篇文章Java实现空间索引编码(GeoHash),个人觉得写得不错。...编码字符的长度(最大为12) GeoHash geoHash = GeoHash.withCharacterPrecision(lat, lon, precision);...String binaryCode = geoHash.toBinaryString(); // 使用给定的经纬度坐标生成的二进制编码 System.out.println("经纬度坐标...= geoHash.toBase32(); // 使用给定的经纬度坐标生成的Geohash字符编码 System.out.println("Geohash编码:" + hashCode...经纬度坐标: (30.549608, 114.376971) 二进制编码:1110011001000111001101110010011011011010 Geohash编码:wt3mf9qu 纬度二进制编码
今天要介绍的GeoHash算法实现的空间索引,虽然是以B树实现,但我认为它也借用网格索引的一部分思想。 GeoHash 原理 GeoHash 算法的原理说起来是很简单的,如下图: ?...10111000111100100111; 我们对它组合,得到40位的二进制串11011 01110 00010 01110 11100 10111 01001 11111; 我们将这个二进制串使用 base32编码...(原理同base64,可以见我的另一篇文章:WEB开发中的字符集和编码,位编码映射表见下),得到 GeoHash 编码为 3OCO4XJ7; 那么GeoHash编码前缀为 3OCO4XJ7的地理点就是离...如果我们把地理位置点和其GeoHash编码存入数据库的话,我们要查找 附近两米点的点,只需要限定条件 geo_code like '3OCO4XJ7%'就行了; 边界点问题 可是最简版的 GeoHash...15 ±0.0027 ±0.0055 ±0.61 7 17 18 ±0.00068 ±0.00068 ±0.076 8 20 20 ±0.000085 ±0.00017 ±0.019 base32 编码映射表
领取专属 10元无门槛券
手把手带您无忧上云