Sql Query计算2个纬度和经度之间的距离

时间:2013-09-23 05:58:45

标签: sql-server

这个问题多次发布,但由于结果不正确,我不得不发布相同的内容。任何人都可以帮助我做错事。

我需要的是Cust_Master中给定客户最近的仓库名称以及WH和客户之间的距离

我有2张表格如下。

WH_Master

WH_Name      Latitude   Longitude
-----------  ---------  ---------
Horamavu     13.02457   77.65723
White Field  12.985278  77.729899
Hennur       13.030672  77.634034

Cust_Master

Cust_ID  Latitude   Longitude
-------  ---------  ---------
Cust-1   13.025579  77.6515 

我尝试了以下选项,它给了我一个错误的距离和位置。对于示例中的当前客户,Horamavu是最近的仓库,根据谷歌的距离是1.8公里。但是我得到的是0.751,这是错误的。

我使用的查询如下。

SELECT Top 1 WH_Name, (( 6367.45 * acos( cos( radians(13.025579) ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians(77.6515) ) + sin( radians(13.025579) ) * sin( radians( Latitude ) ) ) )) AS distance_KM FROM WH_Master

不幸的是,这让我变得相同WH_Name并且距离越来越远也是错误的。你能告诉我正确的查询吗?我使用MS SQL Server作为我的数据库。

1 个答案:

答案 0 :(得分:0)

如果您使用的是SQL 2008或更高版本,则应使用geography数据类型和STDistance函数。

例如:

declare @t table (wh_name nvarchar(50), p geography)
insert @t values 
('horamavu',geography::STGeomFromText('POINT(13.02457 77.65723)', 4326)),
('white field',geography::STGeomFromText('POINT(12.985278  77.729899)', 4326)),
('hennur', geography::STGeomFromText('POINT(13.030672  77.634034)', 4326))

select wh_name, 
    p.STDistance(geography::STGeomFromText('POINT(13.025579 77.6515)', 4326)) distance_m
from @t
order by distance_m

你确定谷歌距离是乌鸦飞行距离,而不是通过道路距离吗?

对于您的原始查询,如果您需要TOP,则需要指定ORDER BY