为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哔哔one 2019-10-06 13:12:50
我正在尝试计算地图上两个位置之间的距离。我已经在数据中存储了:经度,纬度,X POS和Y POS。我以前一直在使用以下代码段。DECLARE @orig_lat DECIMALDECLARE @orig_lng DECIMALSET @orig_lat=53.381538 set @orig_lng=-1.463526SELECT *,    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 #includeDistancesFROM #orig dest但是,我不相信由此产生的数据,它似乎给出了稍微不准确的结果。一些样本数据,以备不时之需Latitude        Longitude     Distance 53.429108       -2.500953     85.2981833133896任何人都可以帮助我解决我的代码,如果您有一种新的方法来实现这一点,那我就介意您是否要解决已有的问题。请说明您的结果采用的计量单位。
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

由于您使用的是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,方法是geography使用以下Point方法构造合适的实例:


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


查看完整回答
反对 回复 2019-10-06
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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


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)


查看完整回答
反对 回复 2019-10-06
?
慕容708150

TA贡献1831条经验 获得超4个赞

Create Function [dbo].[DistanceKM] 

      @Lat1 Float(18),  

      @Lat2 Float(18), 

      @Long1 Float(18), 

      @Long2 Float(18)

)

Returns Float(18)

AS

Begin

      Declare @R Float(8); 

      Declare @dLat Float(18); 

      Declare @dLon Float(18); 

      Declare @a Float(18); 

      Declare @c Float(18); 

      Declare @d Float(18);

      Set @R =  6367.45

            --Miles 3956.55  

            --Kilometers 6367.45 

            --Feet 20890584 

            --Meters 6367450 



      Set @dLat = Radians(@lat2 - @lat1);

      Set @dLon = Radians(@long2 - @long1);

      Set @a = Sin(@dLat / 2)  

                 * Sin(@dLat / 2)  

                 + Cos(Radians(@lat1)) 

                 * Cos(Radians(@lat2))  

                 * Sin(@dLon / 2)  

                 * Sin(@dLon / 2); 

      Set @c = 2 * Asin(Min(Sqrt(@a))); 


      Set @d = @R * @c; 

      Return @d; 


End

GO

用法:


选择dbo.DistanceKM(37.848832506474,37.848732506474,27.83935546875,27.83905546875)


输出:


0,02849639


您可以使用带注释的浮点数更改@R参数。


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 733 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信