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

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

3、详细设计 详细设计主要关注邻近位置算法,也就是,如何根据用户的地理位置寻找距其一定范围内的其他用户。...1、SQL 邻近算法 我们可以将用户经、纬度直接记录到数据库中,纬度记录在 latitude 字段,经度记录在longitude 字段,用户当前的纬度和经度为 X,Y,如果我们想要查找和当前用户经、纬度距离...,分别针对经度和纬度,求取当前区间(对于纬度而言,开始的区间就是[-90, 90], 对于经度而言,开始区间就是[-180, 180])的平均值,将当前区间分为两个区间。...合并规则是,从第一位开始,奇数位为经度,偶数位为纬度,上面例子合并后的结果为 01101 11111 11000 00100 00010,共 25 位二进制数。...Redis 将编码后的二进制数按照 Z 阶曲线的布局,进行一维化展开。即将二维的经、纬度上的点,用一条 Z 型曲线连接起来,Z 阶曲线布局示例如下图。

25610

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

所以就想开发一款 App,用户登陆后能发现附近的那个 Ta,连接彼此。 我该如何实现发现附近的人?...” 多出来的这部分区域内的用户,到圆点的距离一定比圆的半径要大,那么我们就计算用户中心点与正方形内所有用户的距离,筛选出所有距离小于等于半径的用户,圆形区域内的所用户即符合要求的附近的人。...实战 根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库: com.spatial4j...,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。...,如何查找以这个经纬度为中心的一定范围内的其他用用户呢?

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

    利用Redis的Geo功能实现查找附近的位置

    GEO相关的命令如下: Redis 命令 描述 GEOHASH 返回一个或多个位置元素的 Geohash 表示 GEOPOS 从 key 里返回所有给定位置元素的位置(经度和纬度) GEODIST 返回两个给定位置之间的距离...纬度为39.08的地点tianjin和经度为114.29纬度为38.02的地点shijiazhuang加入key为cities:locs的 sorted set集合中。...有效的经度从-180 度到 180 度。有效的纬度从-85.05112878 度到 85.05112878 度。当坐标位置超出上述指定范围时,该命令将会返回一个错误。...WITHCOORD 将位置元素的经度和维度也一并返回,非必选。 WITHDIST 在返回位置元素的同时, 将位置元素与中心点的距离也一并返回。 距离的单位和查询单位一致,非必选。...例如,我们在 cities:locs 中查找以(115.03,38.44)为中心,方圆200km的城市,结果包含城市名称、对应的坐标和距离中心点的距离(km),并按照从近到远排列。

    2.4K50

    利用Redis的Geo功能实现查找附近的位

    GEO相关的命令如下: Redis 命令 描述 GEOHASH 返回一个或多个位置元素的 Geohash 表示 GEOPOS 从 key 里返回所有给定位置元素的位置(经度和纬度) GEODIST 返回两个给定位置之间的距离...纬度为39.08的地点tianjin和经度为114.29纬度为38.02的地点shijiazhuang加入key为cities:locs的 sorted set集合中。...有效的经度从-180 度到 180 度。有效的纬度从-85.05112878 度到 85.05112878 度。当坐标位置超出上述指定范围时,该命令将会返回一个错误。...WITHCOORD 将位置元素的经度和维度也一并返回,非必选。 WITHDIST 在返回位置元素的同时, 将位置元素与中心点的距离也一并返回。距离的单位和查询单位一致,非必选。...例如,我们在 cities:locs 中查找以(115.03,38.44)为中心,方圆200km的城市,结果包含城市名称、对应的坐标和距离中心点的距离(km),并按照从近到远排列。

    1.5K30

    Geohash算法原理及实现

    ; 经纬线和米的换算:经度或者纬度0.00001度,约等于1米,这个在GPS测算距离的时候可以体会到,GPS只要精确到小数点后五位,就是10米范围内的精度 经度0度的位置为本初子午线,在180度的位置转为西经...,数字由大到小依次经过北美洲到达西欧.纬度0度的位置为赤道 基本原理 GeoHash是一种地址编码方法。...GeoHash用一个字符串表示经度和纬度两个坐标。...其中0111和1000两个编码非常相近,但它们的实际距离确很远。所以编码相近的两个单位,并不一定真实距离很近,这需要实际计算两个点的距离才行。...ST_GeoHash() 产生geohash值 ST_LongFromGeoHash() 从geohash值返回经度 ST_LatFromGeoHash() 从geohash值返回纬度 ST_PointFromGeoHash

    2K20

    一口气说出 4种 LBS “附近的人” 实现方式,面试官笑了

    ** 我们来分析一下,多出来的这部分区域内的用户,到圆点的距离一定比圆的半径要大,那么我们就计算用户中心点与正方形内所有用户的距离,筛选出所有距离小于等于半径的用户,圆形区域内的所用户即符合要求的“附近的人...可我当前的点与邻近的点很近,但恰好我们分别在两个区域,明明就在眼前的点偏偏搜不到,实实在在的灯下黑。 **如何解决这一问题?...GEOADD:将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOPOS:从key里面返回所有给定位置对象的位置(经度和纬度); GEODIST:返回两个给定位置之间的距离; GEOHASH...WITHDIST:在返回位置对象的同时,将位置对象与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。 WITHCOORD:将位置对象的经度和维度也一并返回。...2、利弊分析 redis实现附近的人效率比较高,集成也比较简单,而且还支持对距离排序。不过,结果存在一定的误差,要想让结果更加精确,还需要手动将用户中心位置与其他用户位置计算距离后,再一次进行筛选。

    1.5K30

    根据两点经纬坐标计算两点间的距离

    2015-12-30 08:47:44 在进行地图一类的开发中经常会遇到需要计算两点之间的距离,下来看以下如何通过经纬坐标来确定两点间的距离 首先,设两点分别为P1、P2,如果其值是用度分秒形式表示,...则需将其转换成十进制度的形式,如P1点纬度为23度30分,则其纬度值转换成十进制度的形式为23.5度。...然后,分别将两点的经度、纬度值转换成弧度制形式,如P1纬度为23.5度,转换成弧度制则为:23.5*PI / 180。...然后再分别求取两点间的纬度差(dlat)与经度差(dlon); 接下来求取两点间的正弦与余弦值,公式如下:A=sin2(dlat/2) + cos(P1LatInRad)*cos(P2LatInRad)...*Sin2(dlon/2) 接着求取两点的正切值,公式如下:C=2*Math.Atan2(Math.Sqrt(A), Math.Sqrt(1-A)) 最后返回两点间的距离:公式如下:D=EarthRadiusKm

    1.6K20

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

    : 当一组经纬度值都编完码后,我们再把它们的各自编码值组合在一起,组合的规则是:最终编码值的偶数位上依次是经度的编码值,奇数位上依次是纬度的编码值,其中,偶数位从0开始,奇数位从1开始。...GEOPOS 从key里返回所有给定位置元素的位置(经度和纬度)。...距离的单位和用户给定的范围单位保持一致 WITHCOORD: 将位置元素的经度和维度也一并返回 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值...但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。...GEORADIUS 使用输入的经度和纬度来决定中心点 指定成员的位置被用作查询的中心 使用GEOADD添加地理位置信息时,用标准格式的参数 x,y, 所以经度必须在纬度之前。

    1.3K20

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

    所以就想开发一款 App,用户登陆后能发现附近的那个 Ta,连接彼此。 我该如何实现发现附近的人?...” 多出来的这部分区域内的用户,到圆点的距离一定比圆的半径要大,那么我们就计算用户中心点与正方形内所有用户的距离,筛选出所有距离小于等于半径的用户,圆形区域内的所用户即符合要求的附近的人。...实战 根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库: com.spatial4j...,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。...,如何查找以这个经纬度为中心的一定范围内的其他用用户呢?

    1.7K10

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

    所以就想开发一款 App,用户登陆后能发现附近的那个 Ta,连接彼此。 我该如何实现发现附近的人?...” 多出来的这部分区域内的用户,到圆点的距离一定比圆的半径要大,那么我们就计算用户中心点与正方形内所有用户的距离,筛选出所有距离小于等于半径的用户,圆形区域内的所用户即符合要求的附近的人。...实战 根据经纬度和距离获取外接矩形最大、最小经纬度以及根据经纬度计算距离使用了一个第三方类库: com.spatial4j...,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。...,如何查找以这个经纬度为中心的一定范围内的其他用用户呢?

    1.4K20

    Redis 应用实践-地理位置

    每个元素都是一个带有经度和纬度信息的地理位置。地理位置集合中的元素是按照它们的距离从近到远排序的。...geopos命令:获取地理位置集合中指定元素的经度和纬度。geodist命令:获取地理位置集合中两个元素之间的距离。georadius命令:获取地理位置集合中距离指定坐标一定范围内的所有元素。...三、Python应用中使用地理位置数据结构下面我们将介绍如何在Python应用中使用Redis的地理位置数据结构。假设我们有一个城市的商家列表,每个商家都有一个唯一的ID、名称、经度和纬度信息。...我们使用geoadd命令将商家的经度和纬度信息添加到地理位置集合中。添加完成后,我们使用georadius命令获取距离指定坐标一定范围内的所有商家。...在本例中,我们查询距离经度为116.408、纬度为39.916的坐标1000米范围内的所有商家。查询完成后,我们遍历结果,输出每个商家的信息。

    92620

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

    我们很容易从地图上查出来是东经116度24分,北纬39度54分。在大海中航行的船只,只要把所在地的经度测出来,就可以确定船在海洋中的位置和前进方向。 纬度共有90度。...赤道的纬度为0°,将行星平分为南半球和北半球。 纬度是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间。...-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude),则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。...结果是km…… 在实际应用当中,一般是通过一个个体的邮政编码来查找该邮政编码对应的地区中心的经纬度,然 后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围...90-纬度值(90- Latitude),南纬取90+纬度值(90+Latitude), 则经过上述处理过后的两点被计为(MLonA, MLatA)和(MLonB, MLatB)。

    2.4K20

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

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

    1.5K20

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

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

    1.6K30

    火星表面...

    其传统经纬斤正算法示意图如图 1 所示, 图中球面上 点 、 和 经度 / 纬度映射为平面图像横向 / 纵向坐标 和 , 其中相同经度上的点 和 , 斤正后具有相同 的列坐标...和 ,同一纬度上的点 和 斤正后具有相同的行坐标 '和 '通常在忽略镜头误差的情况下, 采用等距投影或正交投影建立鱼眼图像点与球面坐标点之间的 映射关系, 会导致斤正后图像...图中显示伴球面上同一横向经度点 、、 , 经过斤正后映射为平面上的点 、 具有相同行坐标。...;度矫正算法后矫正后3 点 , 位于同一行坐标,对水平方向拱形琦变起到较好的斤正效果, 可见本文所提算法能够同时对鱼眼图像横向与纵向琦变进行矫正。...对上述求取的各 , 求平均值,获取较准确的中心于半径值。 5. 双经度畸变矫正 ?

    1.8K20
    领券