2013-02-22 13 views
10

Ich habe Tabelle mit Daten von GPS, z.B .: Latitude, Longitude, Time, UserIdWie berechnet man den Abstand zwischen mehreren Punkten in SQL Server?

Wie Gesamtdistanz in bestimmten Zeitrahmen aggregieren alle Abstände von allen Punkten (geordnet nach Zeit) und Gruppendaten durch den Benutzer Summieren?

Dank

+0

Für die Entfernungsberechnung hilft selbst Sie möchten sehen < http://williams.best.vwh.net/avform.htm#Dist> –

Antwort

7

Wenn Sie SQL Server verwenden, können Sie bei der Verwendung der Geographie Datentyp interessiert sein, so dass Sie die Datenbank mit dem speziellen Verfahren und geografischen Index anfordern können.

Der Geographie-Datentyp ist, da SQL Server 2008 verfügbar ist, können Sie mehr Informationen hier:

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

Nachdem Sie die Daten in die Geographie Spalte haben, werden Sie in der Lage sein, die berechnen Abstand zwischen zwei Punkten STDistance() Methoden, siehe die MSDN:

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

Hier ist ein Beispiel, wo STDistance() verwendet wird, um den Abstand (mit dem berechnen geographische Verformung) zwischen zwei Punkten in Metern (internationale Standardeinheit zurückgegeben):

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

Wenn Sie SQL Server verwenden 2005 (oder, wenn Sie den Geographie-Datentyp) vermeiden wollen, können Sie einen Blick auf, das MsSQLSpatial Projekt auf CodePlex, finden Sie hier: http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

+0

Und aus irgendeinem Grund ist STDistance Groß-und Kleinschreibung. – David

+1

Der eigentliche Grund liegt an der.Netzimplementierung, die den Räumlichen Features zugrunde liegt (gleiches gilt für Geografie oder Geometrie). Tatsächlich definiert der OGC, dass es ST_Distance in dem Standard sein sollte, der, glaube ich, an die übliche SQL Server-Konvention angepasst wurde. –

5

die unten Funktion gibt Abstand zwischen zwei Geokoordinaten in Meilen

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 

Die unten Funktion gibt Abstand zwischen zwei Geokoordinaten in Kilometern

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 

Verbrauch:

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

Die unten Funktion Abstand zwischen zwei Geokoordinaten in Kilometern mit gibt Geography Datentyp, die 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); 

Referenz eingeführt wurde:Ref1, Ref2

Ich hoffe, das

+1

Beachten Sie, dass Sphäroidberechnungen wie diese ungefähr zehn Meter über Tausende von Kilometern genau sind. Wenn eine höhere Genauigkeit erforderlich ist, verwenden Sie Vincentys oder Karneys Algorithmen. – N8allan

+0

@ N8allan Danke für das Aufzeigen ** Vincenty und Karneys Algorithmen ** –

+1

@ N8allan Ich konnte keine SQL-Skripte für diesen Algorithmus finden. Ich werde versuchen, den Algorithmus in SQL-Skripte zu konvertieren, wenn ich Freizeit habe. –

Verwandte Themen