日期:2014-05-17  浏览次数:20441 次

求某个点某个距离点的经纬度范围值
根据任意2点经纬度计算其距离的公式详见:http://hi.baidu.com/netcoder/item/b3f551ab11642417a8cfb718

开发环境:sql server 2008
条件:
现在有某个表保存了若干个点的邻居关系,每个点的经伟度能够从另外一张表关联找到。

表格样式如下:
Name   Friend
A       B
A       C
A       D
B       C
B       D
.........

需求:
1.找出某个人,例如A,5000米之内的所有记录
2.找出距离在5000米之内的所有记录

如果用Cross JOIN的话,记录一多的话,速度非常慢。现在需要优化一下算法。

我的想法是:
如果某个点(假设为A)要找到其5000米之内的所有Friend,是否可以根据A点的经纬度以及距离(5000米),先计算出另外一点最大的经纬度?然后在JOIN的时候可以过滤一下Friend这一列的经纬度,这样速度可能会快一些。但我不知道如何计算,因此还请各位大师帮忙,谢谢!

------解决方案--------------------
把数学里面的那个开根号的公式转换成SQL不就可以了
------解决方案--------------------
不可以,其实球面距离在5000米之内,所有满足条件的点构成在球面上的一个圆。
最大经纬度只是能圈定球面上一个矩形。范围大于圆。

------解决方案--------------------
你那个链接地址我看过,我觉得可能用不上。既然你说某个表保存若干点的邻居关系,这些点之间有没有距离的记录?
------解决方案--------------------
引用:
根据任意2点经纬度计算其距离的公式详见:http://hi.baidu.com/netcoder/item/b3f551ab11642417a8cfb718

开发环境:sql server 2008
条件:
现在有某个表保存了若干个点的邻居关系,每个点的经伟度能够从另外一张表关联找到。

表格样式如下:
Name   Friend
A       B
A       C
A       D
B       C
B       D
.........

需求:
1.找出某个人,例如A,5000米之内的所有记录
2.找出距离在5000米之内的所有记录

如果用Cross JOIN的话,记录一多的话,速度非常慢。现在需要优化一下算法。

我的想法是:
如果某个点(假设为A)要找到其5000米之内的所有Friend,是否可以根据A点的经纬度以及距离(5000米),先计算出另外一点最大的经纬度?然后在JOIN的时候可以过滤一下Friend这一列的经纬度,这样速度可能会快一些。但我不知道如何计算,因此还请各位大师帮忙,谢谢!


我觉得这个不太可行,因为本来是已知2个经纬度,就2点之间的距离。

你现在要的是已知1个经纬度,和距离,要反推出另一个经纬度,可问题是你可以算出来一堆的经纬度,
因为你能画出一个圆圈来,一个经纬度相当于圆心,而距离相当于半径,那么距离这个圆心的经纬度,是这个圆圈上的任意一个点。

所以这样,返回计算量更大。
------解决方案--------------------





declare @R float
set @R = 6378.137;
declare @lng float
declare @lat float
set @lng = 11.11111;
set @lat = 22.22222;
select * from gmap where @R*acos(cos(lng)*cos(@lng)*(lat-@lat)+sin(lng)*sin(@lng))*1000<=50

--地球面2点间距离的公示
R·arc cos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2] 


以前写的这么一个,你自己稍微做下修改应该可以写出来了吧

------解决方案--------------------
另一个方案供参考:
 用空间换时间,表中除了Name,Friend字段,新增一个距离字段.

每次新增/修改记录数,把距离算好后保存.
当点经纬度信息表有更新时,也同时更新这个表的距离字段.

以上对性能影响应该不大,这样可以把计算压力分散到平时的数据维护中去.
而查询时,直接where Name='A' and [距离字段]<=5000即可.