比如下图中的几款主流移动端IM中的“附近的xxx”功能: ? 那么,对于很多即时通讯(IM)的开发者初学者来说,“附近的人”或者类似功能,在技术实现上还有点摸不着头脑。...对于IM新手来说,可能对于第2步中的根据经纬度数据计算出两点距离,觉得有点难度,实际上根据数据公式(自已百度一下吧,有点复杂,哥不贴了),用代码来实现,只有短短的十来行代码。...以上命令,将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如下图)。 ? 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。
前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 ? georadius换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)),其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...令左图的中心为搜索中心,绿色圆形区域为目标区域,所有点为待搜索的位置对象,红色点则为满足条件的位置对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 ? 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
前言 针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 ? 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)),其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 ? 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的 sorted set 中的查询。...通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的 sorted set 中的查询。...GeoHash,由于区域内的用户传来的经纬度各不相同的,很难做缓存。...zhangsan" 2) "4054756138736536" 2) 1) "lisi" 2) "4054756138536712" GEORADIUSBYMEMBER 找出位于指定范围内的元素...如LBS应用执行下面命令: # 根据输入的用户经纬度信息,查找以该经纬度为中心的5公里内车辆信息,返回给LBS应用 GEORADIUS cars:locations 116.054579 39.030452
针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 ? 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
针对“附近的人”这一位置服务领域的应用场景,互联网应用几乎每天都会用到,比如搜附近的美食,周边游等等;常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...所以在查询时,只要找到集合中处在目标geohash网格中的第一个值,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历的原因也在于九宫格各网格对应的geohash值不具有连续性。
前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...所以在查询时,只要找到集合中处在目标geohash网格中的第一个值,后续依次对比即可,不用多次查找。 九宫格不能一起查,要一个个遍历的原因也在于九宫格各网格对应的geohash值不具有连续性。
针对“附近的人”这一位置服务领域的应用场景,常见的可使用 PG、MySQL 和 MongoDB 等多种 DB 的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的 Key。其中,Key 为集合名称,Member 为该经纬度所对应的对象。...再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点(红点)。 算法分析 为什么要用这种算法策略进行查询,或者说这种策略的优势在哪,让我们以问答的方式进行分析说明。...在多层 GEOHASH 网格中,每个低等级的 GEOHASH 网格都是由 4 个高一级的网格拼接而成(如图)。 ? 换句话说,GEOHASH 网格等级越高,所覆盖的地理位置范围就越小。...并可推算出 Redis 中 GEORADIUS 查找附近的人功能,时间复杂度为:O(N+log(M))。 其中 N 为指定半径范围内的位置元素数量,而 M 则是被九宫格圈住计算距离的元素的数量。
前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。...将给定的位置对象(纬度、经度、名字)添加到指定的key。 其中,key为集合名称,member为该经纬度所对应的对象。...在实际搜索时,首先会根据搜索半径计算geohash网格等级(即右图中网格大小等级),并确定九宫格位置(即红色九宫格位置信息);再依次查找计算九宫格中的点(蓝点和红点)与中心点的距离,最终筛选出距离范围内的点...在多层geohash网格中,每个低等级的geohash网格都是由4个高一级的网格拼接而成(如图)。 图片 换句话说,geohash网格等级越高,所覆盖的地理位置范围就越小。...并可推算出Redis中GEORADIUS查找附近的人功能,时间复杂度为:O(N+log(M)) 其中N为指定半径范围内的位置元素数量,而M则是被九宫格圈住计算距离的元素的数量。
一、日常生活中遇到哪些定位的场景 我们上下班经常会用APP打车和共享单车,下图应该都很熟悉,打开定位,查找我附近的车,那么,这个是怎么实现的呢? 我脑海中第一个实现方式是:实时上报经纬度。...在数据库里,把经纬度都标记为索引,通过查找对比经纬度的值,来找到附近1km的车子,但是这种做法第一是索引比较多,数值比较大,二是需要循环遍历经纬度,查询会很慢,效率很低。...如果2个地方距离越近,那么他们的hash值的前缀越相同。然后通过数据库中like操作符“like wtw366%”快速查找到附近的车。...(31.1688749, 121.3975184)所对应的geohash为wtw366ngz5qt。...在实际应用中,我们就可以动态的调整精度,实现更大或者更小范围内的搜索,既能精准定位,又可以隐藏住一个地点的具体区位信息。
,转换的次数越多,所表示的精度越细,标识的范围越小。...;时间复杂度: O(n+log(m)),n是圆形区域的边界框内的元素数,该元素由中心和半径定界,m是索引内的项数。...这个选项主要用于底层应用或者调试, 实际中的作用并不大。 ⑥ count 限定返回的记录数。 ⑦ asc: 查找结果根据距离从近到远排序。 ⑧ desc: 查找结果根据从远到近排序。...时间复杂度: O(n+log(m)),n是圆形区域的边界框内的元素数,该元素由中心和半径定界,m是索引内的项数。 注意事项同上面georadius指令!!!...,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度),二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。
保存到 Redis 中是用 Geohash 位置 52 点整数编码。 GeoHash 将二维经纬度转换成字符串。...即这个矩形区域内所有的点(经纬度坐标)都共享相同的 GeoHash 字符串,这样既可保护隐私(只表示大概区域位置而非具体点),又容易做缓存。...GeoHash,由于区域内的用户传来的经纬度各不相同的,很难做缓存。...zhangsan" 2) "4054756138736536" 2) 1) "lisi" 2) "4054756138536712" GEORADIUSBYMEMBER 找出位于指定范围内的元素...通过计算该区域的范围,通过计算所涵盖的范围,从不太重要的部分的排序集的得分,并计算得分范围为每个区域的 sorted set 中的查询。
地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的平均半径,记为R。...如同我们的红箭头指的那个点,要找到它附近的点,是不是直接取出它所在的经纬度格子的所有点就可以了呢?再加上围绕它所在格子的八个格子的所有点,那就一定是这个点周围的所有点了! ?...这个就是著名的 Geohash 值得注意的是: 1.Geohash比直接用经纬度的高效很多,而且使用者可以发布地址编码,既能表明自己位于某地方附近,又不至于暴露自己的精确坐标,有助于隐私保护。...在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引) 3.GeoHash表示的并不是一个点,而是一个矩形区域 4.GeoHash编码的前缀可以表示更大的区域。...例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。这个特性可以用于附近地点搜索 查找 通过上面的方法,我们就可以将所有商铺的经纬度给一个编码存进数据库,建立索引。
geo_distance geo_bounding_box geo_polygon geo_distance:直线距离检索,如给定点A,要求返回地图上距离点A三千米的商家 查找索引内距离北京站(116.433733,39.908404...)3000米内的点 涉及的参数如下 location:确定一个点; distance:确定一个半径,单位米 distance_type:确定一个图形的类型,一般是圆形,arc curl --location...查找索引内位于中央民族大学(116.326943,39.95499)以及京站(116.433733,39.908404)矩形的点 涉及的参数如下 top_left: 左上角的矩形起始点经纬度; bottom_right...查找索引内位于西苑桥(116.300209,40.003423),巴沟山水园(116.29561,39.976004)以及北京科技大学(116.364528,39.996348)三角形内的点 涉及的参数如下...points:是个数组,存储多变形定点的经纬度,每个点用大括号包起来 curl --location --request GET 'localhost:9200/geo/_search' \ --header
在redis中的实现 我们日常生活中遇到哪些定位的场景 我们上下班经常会用APP打车和共享单车,下面2张图,应该都很熟悉,打开定位,查找我附近的车,那么,这个是怎么实现的呢?...在数据库里,把经纬度都标记为索引,通过查找对比经纬度的值,来找到附近1km的车子,但是这种做法第一是索引比较多,数值比较大,二是需要循环遍历经纬度,查询会很慢,效率很低。...如果2个地方距离越近,那么他们的hash值的前缀越相同。然后通过数据库中like操作符 “ like wtw366%” 快速查找到附近的车。...将经纬度按照二分算法变成01二进制 上海腾讯大厦的经纬度是 (31.1688749, 121.3975184) 将纬度范围(-90, 90)平分成两个区间(-90, 0)、(0, 90), 如果目标纬度位于前一个区间...在实际应用中,我们就可以动态的调整精度,实现更大或者更小范围内的搜索,既能精准定位,又可以隐藏住一个地点的具区位信息。
3) "shanghai" 4) "beijing" #以经纬度 110,30为中心,半径1500km的范围内的成员 列出成员坐标经纬度 127.0.0.1:6379> georadius china:...110,30为中心,半径1500km的范围内的成员 列出成员坐标经纬度和成员到中心直线距离 127.0.0.1:6379> georadius china:city 110 30 1500 km withcoord...110,30为中心,半径1500km的范围内的成员 列出成员坐标经纬度 限制只查询一个(直线距离最近的) 127.0.0.1:6379> georadius china:city 110...110,30为中心,半径1500km的范围内的成员 列出成员坐标经纬度 限制只查询俩个(直线距离最近的) 127.0.0.1:6379> georadius china:city 110 30 1500..., 但是 georadiusbymember 的中心点是由给定的位置元素决定的 #以beijing为中心 1500km为半径 查找的成员(会查到自己) 127.0.0.1:6379> georadiusbymember
领取专属 10元无门槛券
手把手带您无忧上云