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

Geohash算法原理及实现

GeoHash用一个字符串表示经度和纬度两个坐标。...相邻区域内的绿点明显离红点更近。但因为黄点的编码和红点一样,最终找到的将是黄点。这就有问题了。 要解决这个问题,很简单,只要再查找周边8个区域内的点,看哪个离自己更近即可。 另外就是曲线突变问题。...其中0111和1000两个编码非常相近,但它们的实际距离确很远。所以编码相近的两个单位,并不一定真实距离很近,这需要实际计算两个点的距离才行。...不过仍然有一个问题需要解决,就是如何计算周边的8个区域key值呢 假设我们计算的key值是6位,那么二进制位数就是 6*5 = 30位,所以经纬度分别是15位。我们以纬度为例,纬度会均分15次。...比如说左边区域的经度肯定是自身经度减去最小经度单位。纬度也可以通过加减,得到上下的纬度值,最终周围8个单位也可以计算得到。

81420

Geohash算法原理及实现

; 经纬线和米的换算:经度或者纬度0.00001度,约等于1米,这个在GPS测算距离的时候可以体会到,GPS只要精确到小数点后五位,就是10米范围内的精度 经度0度的位置为本初子午线,在180度的位置转为西经...相邻区域内的绿点明显离红点更近。但因为黄点的编码和红点一样,最终找到的将是黄点。这就有问题了。 要解决这个问题,很简单,只要再查找周边8个区域内的点,看哪个离自己更近即可。 另外就是曲线突变问题。...其中0111和1000两个编码非常相近,但它们的实际距离确很远。所以编码相近的两个单位,并不一定真实距离很近,这需要实际计算两个点的距离才行。...不过仍然有一个问题需要解决,就是如何计算周边的8个区域key值呢 假设我们计算的key值是6位,那么二进制位数就是 6*5 = 30位,所以经纬度分别是15位。我们以纬度为例,纬度会均分15次。...比如说左边区域的经度肯定是自身经度减去最小经度单位。纬度也可以通过加减,得到上下的纬度值,最终周围8个单位也可以计算得到。

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

    使用Redis实现附近的人及打车服务

    LBS应用访问的数据是和人或物关联的一组经纬度信息,而要能查询相邻的经纬度范围,GEO就非常适合应用在LBS服务的场景。...如打车服务: 每辆网约车都有个编号(如666),网约车需将自己的经度、纬度发给叫车应用 打车时,打车应用会根据用户的经纬度位置,查找用户的附近车辆,并匹配 等把位置相近的用户和车辆匹配后,打车应用就会根据车辆编号...这种格式允许半径查询检查的 1 + 8 个领域需要覆盖整个半径,并丢弃元素以外的半径。...刚计算的经纬度(116.37,39.86)各自编码值11010、10111,组合后,第0位是经度的第0位1,第1位是纬度的第0位1,第2位是经度的第1位1,第3位是纬度的第1位0,以此类推,就能得到最终编码值...这种格式允许半径查询检查的 1 + 8 个领域需要覆盖整个半径,并丢弃元素以外的半径。

    1.3K20

    是什么能让 APP 快速精准定位到我们的位置?

    本文包含以下内容,阅读完需要约10分钟: 我们日常生活中遇到哪些定位的场景 简单复习一下经纬度 geohash原理解析 geohash存在的边界问题 如何解决边界问题 计算两点距离的计算 geohash...地球铺平面图 以赤道和本初子午线为界,将地球分为经度和纬度。赤道是在0度,本初子午线也在0度。以赤道作为经度X横坐标,以本初子午线作为纬度 Y 竖坐标。...指定一个位置的经纬度坐标值。 根据十字坐标图和二分法,将纬度和经度划分成1和0的二进制数字串。 按照“偶数位放经度,奇数位放纬度”算法,合并经度和纬度这2个二进制数字串。...园区有2家 A 和 B。B距离我们更近一点,但是,由于A 和腾大在一个hash区块内,所以,就得出了A是最佳的选择。这就是边界的问题。...最后分别计算这些点和自己的距离(由于范围很小,点的数量就也很少,计算量就很少)过滤掉不满足条件的点就ok了。

    1.6K30

    redis georadius源码分析与性能优化

    完工后对服务进行压测后发现georadius的性能比预期要差,因此我分析了georadius的源码,并对原始的实现方案进行了优化,总结成了本文。...那么经纬度是如何转成52bit整数的呢?业内广泛使用的方法是首先对经纬度分别按照二分法编码,然后将各自的编码交叉组合成最后的编码。...我们以116.505021, 39.950898这个坐标为例看下如何编码: 第一次二分操作,把经度分为两个区间:[-180,0)和[0,180],116.505021落在右区间,因此用1表示第一次编码后的值...和[135,180],116.505021落在左区间,因此用0表示第二次编码后的值 按照这种方法依次处理,做完5次后,得到经度值的5位编码值:11010 分区次数 左区间 右区间 经度116.505021...1, // 返回1条 WithCoord: true, // 将位置元素的经纬度一并返回 WithDist: true, // 一并返回距离 }) 改造后

    10910

    揭秘!是什么能让APP快速精准定位?

    geohash通过算法将1个定位的经度和纬度2个数值,转换成1个hash字符串。如果2个地方距离越近,那么他们的hash值的前缀越相同。...我们将地球铺平开来,会得到下面这个平面图: 以赤道和本初子午线为界,将地球分为经度和纬度。赤道是在0度,本初子午线也在0度。...指定一个位置的经纬度坐标值。 根据十字坐标图和二分法,将纬度和经度划分成1和0的二进制数字串。 按照“偶数位放经度,奇数位放纬度”算法,合并经度和纬度这2个二进制数字串。...园区有2家A和B。B距离我们更近一点,但是,由于A和腾大在一个hash区块内,所以,就得出了A是最佳的选择。这就是边界的问题。...最后分别计算这些点和自己的距离(由于范围很小,点的数量就也很少,计算量就很少)过滤掉不满足条件的点就ok了。

    1.5K20

    如何在附近商户中查找离你最近的商家?

    前提背景用户位置按照经纬度获取用户可选范围内的商家查询后的结果按顺序返回给用户商户位置以经纬度存储常用方法数据库查询筛选 根据用户当前位置和用户所选择范围, 在数据库中查询后将结果在数据库中排序或者在内存中排序..., 在做筛选也可关于数据库查询更优秀的写法大家可以看看这篇文章附近商家算法-地理空间距离计算优化 - 金泽夕 - 博客园 (cnblogs.com)利用redis中的geo类型来做范围筛选 可以将用户最大能选范围内的所有商户的经纬度预先存...此命令将返回所有在5公里范围内的商家及其距离和坐标。我们还可以使用GEOFILTER命令对结果进行更复杂的排序和过滤,例如只返回特定类型的商家,或者按照距离排序。...[-180,180],[90, -90],这里我们以经度为例,将经度分为[-180,0],[0,180],有一个点经纬度为[-121,34],用1表示在[-180,0]区间,0表示[0,180]区间,那么这个点表示为...点,c与a的距离为5km,由于a与b前缀编码相同位数更多,将会认为a与b的距离更近,因此为了避免边缘问题,我们在检索时,还要将相邻矩形块也一起遍历,,也就是看似在第三层矩形中找距离最近的点实际上由于边缘问题

    14610

    Redis 实战篇:Geo 算法教你邂逅附近女神

    MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?...” 我们可以通过区域来过滤出有限「女神」坐标数据,再对矩形区域内的数据进行全量距离计算再排序,这样计算量明显降低。 “如何划分矩形区域呢?...实战 根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库: com.spatial4j...在进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...合并经纬度编码 假如计算的经纬度编码分别是 11011 和00101`,目标编码第 0 位则从经度第 0 位的值 1 作为目标值,目标编码的第 1 位则从纬度第 0 位值 0 作为目标值,以此类推:

    1.7K10

    redis常用命令和数据类型

    语法: geoadd key 经度 纬度 地名 经度 纬度 地名 ... ... 2、geopos:获取地理位置的坐标(经度,纬度) geopos key 地名 3、geodist:计算两个位置之间的距离...georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素 georadius key 经度 纬度 半径值 单位 [WITHCOORD] [WITHDIST...] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。...WITHCOORD: 将位置元素的经度和纬度也一并返回。 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。...例如:20220526这天访问网站的用户id是:1、2、5、9 20220527这天访问网站的用户id是:0、1、4、9 计算出这两天都访问过网站的用户数量 and:与操作,都为1的时候才为1 or

    90710

    Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

    所以就想开发一款 App,用户登陆后能发现附近的那个 Ta,连接彼此。 我该如何实现发现附近的人?...MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?...” 我们可以通过区域来过滤出有限「女神」坐标数据,再对矩形区域内的数据进行全量距离计算再排序,这样计算量明显降低。 “如何划分矩形区域呢?...实战 根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库: com.spatial4j...合并经纬度编码 假如计算的经纬度编码分别是 11011 和00101`,目标编码第 0 位则从经度第 0 位的值 1 作为目标值,目标编码的第 1 位则从纬度第 0 位值 0 作为目标值,以此类推: ?

    1.4K20

    Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

    MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近的其他数据,按照距离排序,如何下手呢?...” 我们可以通过区域来过滤出有限「女神」坐标数据,再对矩形区域内的数据进行全量距离计算再排序,这样计算量明显降低。 “如何划分矩形区域呢?...实战 根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库: com.spatial4j...在进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...合并经纬度编码 假如计算的经纬度编码分别是 11011 和00101`,目标编码第 0 位则从经度第 0 位的值 1 作为目标值,目标编码的第 1 位则从纬度第 0 位值 0 作为目标值,以此类推: ?

    1.2K50

    Redis GeoHash核心原理解析

    但是对于空间上的一个点(二维,包括经度和纬度),如何排序呢?又如何索引呢?解决的方法很多,下文介绍一种方法来解决这一问题。...GeoHash算法 上文讲了GeoHash的计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。...每个POI都有经纬度信息,用图1b的SQL语句在mySQL中建立了POI_spatial的表,其中lat和lng两个字段来代表纬度和经度。为后续分析方便起见,我人造了40万个POI数据。...方法一:暴力方法 该方法的思路很直接:计算位置与所有POI的距离,并保留距离小于50米的POI。...根据这个思路我们执行SQl查询(图5)(注:经度或纬度每隔0.001度,距离相差约100米,由此推算出矩形左下角和右上角坐标),发现过滤后正好剩下两个POI。

    1.6K20

    交友系统设计:哪种地理空间邻近算法更快?

    我们可以通过 Liao App 获取用户当前经、纬度坐标,然后根据经、纬度,计算两个用户之间的距离,距离计算公式采用半正矢公式: image-20231219231858953 其中 r 代表地球半径,...1、SQL 邻近算法 我们可以将用户经、纬度直接记录到数据库中,纬度记录在 latitude 字段,经度记录在longitude 字段,用户当前的纬度和经度为 X,Y,如果我们想要查找和当前用户经、纬度距离...而且我们用经、纬度距离进行近似计算,在高纬度地区,这种近似计算的偏差还是非常大的。...经、纬度数字的不同精度,意味着经、纬度的误差范围,比如保留经、纬度到小数点后第1 位,那么误差范围最大可能会达到 11 公里(在赤道附近)。...如此不断重复,可以在经度和纬度方向上,得到两个二进制数。这个二进制数越长,其所在的区间越小,精度越高。

    24710

    Redis高级篇之GEO搜索最近地铁口

    都知道地球上的地理位置是使用二维的经纬度表示,经度范围(-180,180],纬度范围(-90,90],只要我们确定一个点的经纬度就可以得他在地球的位置。...哈希表用于存储地理位置的元数据,例如地点名称、地址等;有序集合用于存储地理位置的坐标信息,例如经度和纬度。坐标编码GEO数据结构使用经纬度表示地理位置的坐标信息。...经纬度是一种常用的地理坐标系统,它使用经度和纬度来表示地球上的位置。在GEO数据结构中,经度和纬度被编码为一个64位的整数,以便进行高效的计算和比较。...在GEO数据结构中,Haversine公式被用于计算两个地理位置之间的距离,以便进行搜索和排序。搜索算法GEO数据结构使用了一种基于跳表的搜索算法来实现高效的地理位置搜索。...GEOPOS命令返回的结果包括地铁口的ID、经纬度和距离。

    59732

    Redis实现附近的人

    当用户登录应用时,或者保持用户登录后用户在使用应用时,客户端是可以时刻获取用户位置信息的(前提是用户要开启位置获取的权限),客户端获取到最新的地理位置后,上传到后端服务器进行更新。...GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)。...距离的单位和用户给定的范围单位保持一致 WITHCOORD: 将位置元素的经度和维度也一并返回 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值...这种格式允许半径查询检查的 1 + 8 个领域需要覆盖整个半径,并丢弃元素以外的半径。...通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的 sorted set 中的查询。

    73820

    深入浅出Redis(十一):Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器

    、附近的人等功能Geospatial 使用GeoHash算法,底层实现使用zset对象 因此也可以使用Zset命令geoadd 添加geoadd key 经度 纬度 名称将指定的地理空间位置(纬度、经度...shanghai 113.88 22.55 shenzhen 104.10 30.65 chendu (integer) 3geopos 获取geopos key 成员名...从key里返回所有给定位置元素的位置(经度和纬度...110,30为中心,半径1500km的范围内的成员 列出成员坐标经纬度和成员到中心直线距离 127.0.0.1:6379> georadius china:city 110 30 1500 km withcoord...(不了解sds的同学可以先看这篇文章深入浅出Redis(一):对象与数据结构)setbit :先计算len是否需要扩容,再计算偏移量在哪个字节上,接着计算偏移量在哪个位上,修改那个位的值并返回旧的值getbit...:计算偏移量在哪个字节上,接着计算偏移量在哪个位上,再获取bittop :and、or、xor都是新建sds 每个字节做位操作结果放入新建sds中 ;not 则是直接取反bitcount : 数据量小于

    36131

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

    这样纬度二分结束,可以得到一串0-1编码,纬度产生的编码为10111 00011,经度也是这样组码,经度产生的编码为11010 01011 偶数位放经度,奇数位放纬度,把2串编码组合生成新串:11100...GeoHash编码的好处 查询复杂度高,通过计算位置的距离来查询与当前位置距离近的位置计算成本高,采用GeoHash编码后可以将二维坐标点转换为一维数据,进行排序,实现空间索引来进行查找。...但是如果现在不仅仅是三个位置,如果是几十万甚至是更多的位置,我们应该如何处理呢?如果还是求任意两个位置的欧式距离显然那是灾难性的。...而GeoHash对这些位置进行编码,通过前缀匹配,匹配度越高的位置就越相近,但是仔细想想如果两个位置被分到两个不同的矩形区域中,它们的匹配度很低,但是两个位置距离很近,比如下面的和红点距离近的绿点显然和红点是在一个矩形区域中...我们在前面组码经纬纬度时就是这样的,经度纬度经度纬度的间隔组码,因此会出现上面所说的情况,匹配度很低,但是距离很近的情况。

    3.5K20

    根据两点的经纬度计算距离_经纬度两点距离

    为了避免同一地区使用两个不同的日期,国际日期变线在遇陆地时略有偏离。 每一经度和纬度还可以再细分为60分,每一分再分为60秒以及秒的小数。...例如问北京的经纬度是多少?我们很容易从地图上查出来是东经116度24分,北纬39度54分。在大海中航行的船只,只要把所在地的经度测出来,就可以确定船在海洋中的位置和前进方向。 纬度共有90度。...横线是纬度,竖线是经度。 当然可以计算,四元二次方程。 经度和纬度都是一种角度。经度是个两面角,是两个经线平面的夹角。...结果是km…… 在实际应用当中,一般是通过一个个体的邮政编码来查找该邮政编码对应的地区中心的经纬度,然 后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围...-各个旅客的邮政编码对应的经纬度和酒店的经纬度所 计算的距离范围-等等),所以,通过邮政编码查询经纬度这样一个数据库是一个很有用的资源。

    2.3K20
    领券