2013-02-22 163 views
10

我有來自GPS的數據表,例如:LatitudeLongitudeTimeUserId如何計算SQL Server中多個點之間的距離?

如何聚集在特定的時間框架由所有點(按時間排序)和組數據由用戶彙總所有距離總距離是多少?

感謝

+0

對於距離計算本身你可能想看看< http://williams.best.vwh.net/avform.htm#Dist> – 2013-02-23 00:48:35

回答

7

如果您使用的是SQL Server,則可能有興趣使用地理數據類型,所以你可以要求使用專用的方法和地理索引數據庫。

地理數據類型是可用,因爲SQL Server 2008中,您可以瞭解更多信息就在這裏:

http://msdn.microsoft.com/en-us/library/cc280766.aspx

一旦你將數據導入地理列,你就可以計算出使用STDistance()方法的兩個點之間的距離,請參閱MSDN:

http://msdn.microsoft.com/en-us/library/bb933808.aspx

這裏是STDistance()被用於計算距離的例子(與地理變形),以米爲單位返回兩個點之間(國際標準單位):

DECLARE @pointA geography; 
DECLARE @pointB geography; 
SET @pointA = geography::STGeomFromText('POINT(-122.34900 50)', 4326); 
SET @pointB = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 
SELECT @pointA.STDistance(@pointB); 

如果你使用SQL Server 2005(或者,如果你想避免使用地理數據類型),你可以看看在CodePlex上的MsSQLSpatial項目,可在這裏:http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

+0

由於某些原因,STDistance區分大小寫。 – David 2017-07-25 03:53:47

+1

實際原因是由於。Spatial功能中的基礎實施(與地理或幾何相同)。事實上,OGC在標準中定義它應該是ST_Distance,我認爲它已經適應了通常的SQL Server約定。 – 2017-07-26 20:40:19

5

下面的函數給出英里地理座標距離之間的兩個

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 

的以下函數給出公里2個地理座標之間距離

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 

用法:

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

的以下函數給出了在使用公里 地理座標距離之間的兩個Geography這是在SQL Server推出數據類型2008

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); 

參考:Ref1Ref2

我希望這有助於

+1

請注意,像這些球體計算精確到千米以上約10米。如果需要更高的精確度,請使用Vincenty或Karney的算法。 – N8allan 2014-08-29 16:22:24

+0

@ N8allan感謝您指出** Vincenty和Karney的算法** – 2014-08-29 16:45:47

+1

@ N8allan我無法找到此算法的任何SQL腳本。當我有空閒時,我將嘗試將算法轉換爲SQL腳本。 – 2014-08-29 16:50:48

相關問題