3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
由于您使用的是SQL Server 2008,因此具有g(shù)eography可用的數(shù)據(jù)類型,該數(shù)據(jù)類型專門用于此類數(shù)據(jù):
DECLARE @source geography = 'POINT(0 51.5)'
DECLARE @target geography = 'POINT(-3 56)'
SELECT @source.STDistance(@target)
給
----------------------
538404.100197555
(1 row(s) affected)
告訴我們,從(倫敦附近)到(愛丁堡附近)大約538公里。
當(dāng)然,首先需要學(xué)習(xí)很多東西,但是一旦您知道它,就比實(shí)現(xiàn)自己的Haversine計(jì)算容易得多。再加上您可以獲得很多功能。
如果您想保留現(xiàn)有的數(shù)據(jù)結(jié)構(gòu),則仍然可以使用STDistance,方法是geography使用以下Point方法構(gòu)造合適的實(shí)例:
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

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
下面的函數(shù)給出兩個(gè)地理坐標(biāo)之間的距離(以英里為單位)
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
下面的函數(shù)給出了兩個(gè)地理坐標(biāo)之間的距離(以千米為單位)
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
下面的函數(shù) 使用sql server 2008中引入的Geography數(shù)據(jù)類型,以公里為單位給出兩個(gè)地理坐標(biāo)之間的距離
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)

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
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
您可以使用帶注釋的浮點(diǎn)數(shù)更改@R參數(shù)。
添加回答
舉報(bào)