千里救急,已知一个经纬度,怎么获取5公里以内的经纬度坐标范围。(版主帮加急)

问题描述

咳咳,是这样的,所有的好友都有个经纬度,我现在已知道自己的经纬度,想把5公里以内的好友列表全取出来,这个应该有个算法,大家是怎么搞的?在线等候给分,100分哦……,万分火急,加急………………………………

解决方案

解决方案二:
这个方法用于计算两个点之间的距离privatestaticdoubledistance(doublelon1,doublelat1,doublelon2,doublelat2){doublepi=0.0174532925199432944;//PI/180;doublet5=Math.sin(lat1*pi)*Math.sin(lat2*pi)+Math.cos(lat1*pi)*Math.cos(lat2*pi)*Math.cos((lon1-lon2)*pi);return(Math.atan(-t5/Math.sqrt(-t5*t5+1))+2*Math.atan(1))*3437.74677*1.1508*1.6093470878864446*1000;}
解决方案三:
引用1楼xie609的回复:

这个方法用于计算两个点之间的距离privatestaticdoubledistance(doublelon1,doublelat1,doublelon2,doublelat2){doublepi=0.0174532925199432944;//PI/180;doublet5=Math.sin(lat1*pi)*Math.sin(lat2*pi)+Math.cos(lat1*pi)*Math.cos(lat2*pi)*Math.cos((lon1-lon2)*pi);return(Math.atan(-t5/Math.sqrt(-t5*t5+1))+2*Math.atan(1))*3437.74677*1.1508*1.6093470878864446*1000;}

学习一下
解决方案四:
引用1楼xie609的回复:

这个方法用于计算两个点之间的距离privatestaticdoubledistance(doublelon1,doublelat1,doublelon2,doublelat2){doublepi=0.0174532925199432944;//PI/180;doublet5=Math.sin(lat1*pi)*Math.sin(lat2*pi)+Math.cos(lat1*pi)*Math.cos(lat2*pi)*Math.cos((lon1-lon2)*pi);return(Math.atan(-t5/Math.sqrt(-t5*t5+1))+2*Math.atan(1))*3437.74677*1.1508*1.6093470878864446*1000;}

我算的不是两个点,我是5公里以内的所有点
解决方案五:
知道两个点的距离怎么计算了,做一次对所有好友的迭代,一一计算距离不就出来了?或者说,你是考虑性能问题,好友太多,距离计算量太大?比如R-tree?
解决方案六:
引用4楼deltatang的回复:

知道两个点的距离怎么计算了,做一次对所有好友的迭代,一一计算距离不就出来了?或者说,你是考虑性能问题,好友太多,距离计算量太大?比如R-tree?

是的,好友太多,其实不是好友也得列出来,就是不可能把所有的人的距离都算出来再处理,因为速度确实慢。
解决方案七:
引用5楼tjcyjd的回复:

Quote: 引用4楼deltatang的回复:
知道两个点的距离怎么计算了,做一次对所有好友的迭代,一一计算距离不就出来了?或者说,你是考虑性能问题,好友太多,距离计算量太大?比如R-tree?

是的,好友太多,其实不是好友也得列出来,就是不可能把所有的人的距离都算出来再处理,因为速度确实慢。

俺不是给你提示了么?R-Tree。。。或者gg一下高维检索空间划分虾米的这方面的paper是很多的
解决方案八:
引用3楼tjcyjd的回复:

Quote: 引用1楼xie609的回复:
这个方法用于计算两个点之间的距离privatestaticdoubledistance(doublelon1,doublelat1,doublelon2,doublelat2){doublepi=0.0174532925199432944;//PI/180;doublet5=Math.sin(lat1*pi)*Math.sin(lat2*pi)+Math.cos(lat1*pi)*Math.cos(lat2*pi)*Math.cos((lon1-lon2)*pi);return(Math.atan(-t5/Math.sqrt(-t5*t5+1))+2*Math.atan(1))*3437.74677*1.1508*1.6093470878864446*1000;}

我算的不是两个点,我是5公里以内的所有点

可以先对数据进行一些简单的处理,比如先根据已知的经纬度和5公里这个距离,得出一个经度和纬度的边界值,也就是地图上的一个矩形范围,用这个边界值先过滤一遍好友列表,然后再计算距离进行过滤,这是简单的两步处理。其实即使是第二步,也不是所有的点都要计算的,比如假设已知点A经纬度分别为a1,a2你已经计算出一个点B(b1,b2)在这个范围内,如果有个点C(c1,c2),满足a1<c1<b1且a2<c2<b2的话肯定也在这个范围内的(当然如果a1>b1的话前边的式子就得用>了,a2b2亦然)
解决方案九:
引用7楼xie609的回复:

Quote: 引用3楼tjcyjd的回复:
Quote: 引用1楼xie609的回复:
这个方法用于计算两个点之间的距离privatestaticdoubledistance(doublelon1,doublelat1,doublelon2,doublelat2){doublepi=0.0174532925199432944;//PI/180;doublet5=Math.sin(lat1*pi)*Math.sin(lat2*pi)+Math.cos(lat1*pi)*Math.cos(lat2*pi)*Math.cos((lon1-lon2)*pi);return(Math.atan(-t5/Math.sqrt(-t5*t5+1))+2*Math.atan(1))*3437.74677*1.1508*1.6093470878864446*1000;}

我算的不是两个点,我是5公里以内的所有点

可以先对数据进行一些简单的处理,比如先根据已知的经纬度和5公里这个距离,得出一个经度和纬度的边界值,也就是地图上的一个矩形范围,用这个边界值先过滤一遍好友列表,然后再计算距离进行过滤,这是简单的两步处理。其实即使是第二步,也不是所有的点都要计算的,比如假设已知点A经纬度分别为a1,a2你已经计算出一个点B(b1,b2)在这个范围内,如果有个点C(c1,c2),满足a1<c1<b1且a2<c2<b2的话肯定也在这个范围内的(当然如果a1>b1的话前边的式子就得用>了,a2b2亦然)

或者你也可以这样优化。如上图你已经计算出B点在5公里范围内了,可以根据B点和A点的经纬度差值,再构建一个矩形区域,那么在这个区域中的点都无需再计算了肯定都在这个范围内了。(当然你也可以直接计算5公里这个圆的内接正方形进行过滤,那么就只有少量的位于内接正方形以外的点需要计算距离了)
解决方案十:
引用8楼xie609的回复:

Quote: 引用7楼xie609的回复:
Quote: 引用3楼tjcyjd的回复:
Quote: 引用1楼xie609的回复:
这个方法用于计算两个点之间的距离privatestaticdoubledistance(doublelon1,doublelat1,doublelon2,doublelat2){doublepi=0.0174532925199432944;//PI/180;doublet5=Math.sin(lat1*pi)*Math.sin(lat2*pi)+Math.cos(lat1*pi)*Math.cos(lat2*pi)*Math.cos((lon1-lon2)*pi);return(Math.atan(-t5/Math.sqrt(-t5*t5+1))+2*Math.atan(1))*3437.74677*1.1508*1.6093470878864446*1000;}

我算的不是两个点,我是5公里以内的所有点

可以先对数据进行一些简单的处理,比如先根据已知的经纬度和5公里这个距离,得出一个经度和纬度的边界值,也就是地图上的一个矩形范围,用这个边界值先过滤一遍好友列表,然后再计算距离进行过滤,这是简单的两步处理。其实即使是第二步,也不是所有的点都要计算的,比如假设已知点A经纬度分别为a1,a2你已经计算出一个点B(b1,b2)在这个范围内,如果有个点C(c1,c2),满足a1<c1<b1且a2<c2<b2的话肯定也在这个范围内的(当然如果a1>b1的话前边的式子就得用>了,a2b2亦然)

或者你也可以这样优化。如上图你已经计算出B点在5公里范围内了,可以根据B点和A点的经纬度差值,再构建一个矩形区域,那么在这个区域中的点都无需再计算了肯定都在这个范围内了。(当然你也可以直接计算5公里这个圆的内接正方形进行过滤,那么就只有少量的位于内接正方形以外的点需要计算距离了)

嗯,非常不错的建议,还有没有其它的办法
解决方案十一:
利用GeoHash值做索引来实现快速查找和粗排序,在利用计算两点间距离实现精确距离计算和精确排序。实际上这里的问题主要是解决计算量大的问题,我们的解决方案是为了快速定位和减少计算,否则用户想查出5公里范围的好友如果需要很长时间,我想他早也没有心气看了。方案:使用redis做缓存,使用你的经纬度计算出来的的GeoHash的code值得前8、7、6、5位建立四个桶,你的好友或是其他用户如果登录系统也会用他们的经纬度计算出一个GeoHash的code,这些人都会按照8、7、6、5的顺序放入桶内,这样这些桶里就有你想要的人了,取桶的顺序是8、7、6、5依次来,当然一般用户在手机上能翻几页也就够了,所以一般8、7里面的数据就已经满足用户的翻页需求了,剩下的估计就是搜索了,那其实同样的逻辑。注意:8桶的人一定会在7桶里,一次类推,但是反过来就不成立,所以你要记得去重。希望这样简单的介绍对你有所帮助!

时间: 2024-10-31 02:58:49

千里救急,已知一个经纬度,怎么获取5公里以内的经纬度坐标范围。(版主帮加急)的相关文章

地图api-百度地图怎样通过一个城市,获取1000公里以内的其他城市名

问题描述 百度地图怎样通过一个城市,获取1000公里以内的其他城市名 就是比如我知道一个城市的经纬度,然后通过这个经纬度找到1000公里以内其他的城市名字 解决方案 中国的地级市也就几百个,根本不要用百度地图,下载一个中国城市坐标的数据库,自己查询下. 参考http://download.csdn.net/detail/drift_away/4567164http://www.wenkudaquan.com/doc/20130208/1039993.html http://www.cnblogs

flex开发-已知一个gps坐标(84坐标系)和距离如10公里,求距离这个坐标的最大经纬度

问题描述 已知一个gps坐标(84坐标系)和距离如10公里,求距离这个坐标的最大经纬度 用flex开发这么一个功能,在地图上已知一个gps坐标,一个距离, 以这个坐标为中心,绘制一个圆形区域或正方形(GeometryService服务没有启动)

百度地图 js 通过IP定位城市后,已知一个坐标集合,根据每个坐标添加标注点,求大神help me

问题描述 百度地图 js 通过IP定位城市后,已知一个坐标集合,根据每个坐标添加标注点,求大神help me var myCity = new BMap.LocalCity(); // 以当前IP定位到城市 myCity.get(myFun); // 根据IP对当前城市进行定位 function myFun(result){ var center = result.center; // 城市坐标中心点 var point = new BMap.Point(center.lng,center.la

c++-已知一个多边形的各个顶点的坐标,如何通过算法扩大这几个顶点?

问题描述 已知一个多边形的各个顶点的坐标,如何通过算法扩大这几个顶点? 用MFC画多边形,已知各个顶点的坐标,现在我想通过这几个顶点把多边形向外扩大一点点,并得到新的顶点坐标,有木有什么算法?求大神告知,最好有代码!谢谢! 解决方案 已知任意一个多边形的各个顶点的坐标,怎么去求该多边形的面积? 解决方案二: 有一个想法,你先确定多边形的中心位置,然后以中心点为参考点,将周围的坐标点向外延伸

已知一个带有头结点的单链表,设计算法将该单链表复制一个拷贝,急急急

问题描述 已知一个带有头结点的单链表,设计算法将该单链表复制一个拷贝,急急急 已知一个带有头结点的单链表,设计算法将该单链表复制一个拷贝,急急急 解决方案 http://zhidao.baidu.com/link?url=07NsUCYjlwgZFGwfyhqq9NxVTk7hVXs7yBAZAyChUU_CPFIZ_WjwusNVPD7CDC1vjFVaMMTGFwp-H8tnfQb9Qa

贪婪-已知一个大矩形的长宽,需要分解若干已知但不同长宽的小矩形。如何损耗最低?

问题描述 已知一个大矩形的长宽,需要分解若干已知但不同长宽的小矩形.如何损耗最低? 例如一种木板2M长,1.5M宽,需要?33cm长40cm高的木板20,需要44cm长,49cm宽的木板18.如此该如何切割找出最省材料的算法?损耗最低?编程语言不限,只求好一点的算法,是不是除了穷举然后对比就没有更好的了?

已知一个面的各个角坐标如何用VB判断一个点是否在面之内?

问题描述 已知一个面的各个角坐标如何用VB判断一个点是否在面之内? 已知一个面的各个角坐标如何用VB判断一个点是否在面之内? 已知一个面的各个角坐标如何用VB判断一个点是否在面之内? 解决方案 从图形外部构建一个直线方程,到这个点,看和你的曲线有几个交点,偶数个就在内部,奇数个就在外部. 解决方案二: 可以根据在直线的左边还是右边来判断,用向量的叉乘来做就行了. 解决方案三: caozhy给的方法很好啊.以前学过现在都不知道了,呵呵.这样就不用管面是几边形了.

已知一个坐标A(x,y),求离A最近的N个坐标点,这个怎么算?

问题描述 已知一个坐标A(x,y),求离A最近的N个坐标点,这个怎么算? 解决方案 解决方案二:有人知道吗,帮忙解决一下啊解决方案三:一个个算出来比较啊解决方案四:8个啊x-1,y-1x-1,yx-1,y+1x,y-1x,y+1x+1,y-1x+1,yx+1,y+1解决方案五:如何算,如何比较,一共有几十万个坐标点,不可能一个一个的算和比较吧解决方案六://两点坐标距离为(X-X1)平方+(Y-Y1)平方再开根号intx;inty;intiTemp=...;sPoints[0]与坐标X,Y的距离

同局域网内,已知一个设备的外网IP,如何获取其外网IP?

问题描述 在同一个局域网内,已知一个设备的外网IP,如何获取其内网IP?用C#代码该怎么实现?或者是,在Socket通讯中,怎么获取远端设备的内网IP? 解决方案 本帖最后由 GAMU_kaito 于 2014-02-13 10:46:12 编辑解决方案二:补充一下,这个时候那个设备是在线的,但是那天设备不是本地机器个人的思路是:1.首先获取到局域网内所有在线的设备的外网IP和内网IP2.根据已知的外网IP查找到对应的内网IP但是一来,个人不知道第一步该怎样用代码实现:二来,觉得这样的方法似乎很