计算两点之间的距离(纬度,经度)

我试图计算地图上两个位置之间的距离。 我已经存储在我的数据中:经度,纬度,X POS,Y POS。

我以前一直在使用下面的代码片段。

DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
    3956 * 2 * ASIN(
          SQRT( POWER(SIN((@orig_lat - abs(dest.Latitude)) * pi()/180 / 2), 2) 
              + COS(@orig_lng * pi()/180 ) * COS(abs(dest.Latitude) * pi()/180)  
              * POWER(SIN((@orig_lng - dest.Longitude) * pi()/180 / 2), 2) )) 
          AS distance
--INTO #includeDistances
FROM #orig dest

然而,我不信任这些数据,它似乎给出了稍微不准确的结果。

一些示例数据,以防您需要

Latitude        Longitude     Distance 
53.429108       -2.500953     85.2981833133896

任何人都可以用我的代码来帮助我,如果你想要解决我已有的问题,并不介意,如果你有一种新的方法来实现这一点,那将很棒。

请说明您的结果所在的度量单位。


由于您使用的是SQL Server 2008,因此您可以使用geography数据类型,该数据类型专为这类数据设计:

DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'

SELECT @source.STDistance(@target)

----------------------
538404.100197555

(1 row(s) affected)

告诉我们从伦敦到(靠近)爱丁堡约538公里。

自然会有大量的学习要先完成,但一旦你知道它就比实现自己的Haversine计算要容易得多; 再加上你获得了很多功能。


如果要保留现有数据结构,则仍然可以使用STDistance ,方法是使用Point方法构建适当的geography实例:

DECLARE @orig_lat DECIMAL(12, 9)
DECLARE @orig_lng DECIMAL(12, 9)
SET @orig_lat=53.381538 set @orig_lng=-1.463526

DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326);

SELECT *,
    @orig.STDistance(geography::Point(dest.Latitude, dest.Longitude, 4326)) 
       AS distance
--INTO #includeDistances
FROM #orig dest

下面的函数以英里为单位给出两个地理坐标之间的距离

create function [dbo].[fnCalcDistanceMiles] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4))
returns decimal (8,4) as
begin
declare @d decimal(28,10)
-- Convert to radians
set @Lat1 = @Lat1 / 57.2958
set @Long1 = @Long1 / 57.2958
set @Lat2 = @Lat2 / 57.2958
set @Long2 = @Long2 / 57.2958
-- Calc distance
set @d = (Sin(@Lat1) * Sin(@Lat2)) + (Cos(@Lat1) * Cos(@Lat2) * Cos(@Long2 - @Long1))
-- Convert to miles
if @d <> 0
begin
set @d = 3958.75 * Atan(Sqrt(1 - power(@d, 2)) / @d);
end
return @d
end 

下面的函数给出了以公里为单位的两个地理坐标之间的距离

CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT 
AS
BEGIN

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END

下面的函数使用在sql server 2008中引入的Geography数据类型给出了以公里为单位的两个地理坐标之间的距离

DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);

用法:

select [dbo].[fnCalcDistanceKM](13.077085,80.262675,13.065701,80.258916)

参考: Ref1,Ref2


在您使用SQL 2008或更高版本时,我建议查看GEOGRAPHY数据类型。 SQL已经构建了对地理空间查询的支持。

例如,您在您的GEOGRAPHY类型的表格中会有一个列,其中填充了坐标的地理空间表示(请参阅上面链接的MSDN参考资料)。 然后这个数据类型公开了允许你执行大量地理空间查询的方法(例如找到2个点之间的距离)

链接地址: http://www.djcxy.com/p/70975.html

上一篇: Calculating distance between two points (Latitude, Longitude)

下一篇: Which data type for latitude and longitude?