2013-02-22 41 views
10

Ho tabella con i dati di GPS, es .: Latitude, Longitude, Time, UserIdCome calcolare la distanza tra più punti in SQL Server?

come aggregare distanza totale nel periodo di tempo specificato sommando le distanze da tutti i punti (in ordine di tempo) e raggruppare i dati per l'uso?

Grazie

+0

Per il calcolo della distanza in sé si consiglia di guardare a < http://williams.best.vwh.net/avform.htm#Dist> –

risposta

7

Se si utilizza SQL Server, si potrebbe essere interessati a utilizzare il tipo di dati di geografia in modo da poter richiedere il database utilizzando il metodo dedicato e l'indice geografica.

Il tipo di dati geografia è disponibile dal momento che SQL Server 2008, è possibile ulteriori informazioni qui:

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

Una volta che hai i dati in colonna geografia, si sarà in grado di calcolare il distanza tra due punti usando STDistance metodi(), vedere il MSDN:

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

Ecco un esempio in cui STDistance() è utilizzata per calcolare la distanza (con la deformazione geografica) tra due punti restituiti in metri (unità standard internazionale):

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

Se stai usando SQL Server 2005 (o, se si vuole evitare di utilizzare il tipo di dati geografia), è possibile dare un'occhiata a il progetto MsSQLSpatial su CodePlex, disponibile qui: http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

+0

E per qualche motivo, STDistance fa distinzione tra maiuscole e minuscole. – David

+1

Il motivo reale è dovuto al.Implementazione di rete sottostante nelle caratteristiche spaziali (stessa per Geografia o Geometria). Infatti, l'OGC sta definendo che dovrebbe essere ST_Distance nello standard che, penso, è stato adattato alla solita convenzione di SQL Server. –

5

la funzione qui sotto dà distanza tra due geocoordinates in miglia

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 

La funzione seguente fornisce distanza tra due geocoordinates in Km

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 

utilizzati:

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

La funzione seguente fornisce distanza tra due geocoordinates in Km utilizzando Geography tipo di dati che è stato introdotto in 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); 

Riferimento:Ref1, Ref2

Spero che questo aiuta

+1

Si noti che i calcoli sferoidali come questi sono precisi per circa 10 metri su migliaia di km. Se è necessaria una maggiore precisione, utilizzare gli algoritmi di Vincenty o di Karney. – N8allan

+0

@ N8allan Grazie per aver segnalato ** Algoritmi di Vincenty e Karney ** –

+1

@ N8allan Non sono riuscito a trovare alcun script sql per questo algoritmo. Ho intenzione di provare a convertire l'algoritmo in script SQL quando ho tempo libero. –

Problemi correlati