Ich versuche, die Entfernung zwischen zwei Positionen auf einer Karte zu berechnen. Ich habe in meinen Daten gespeichert: Längengrad, Breitengrad, X POS, Y POS.
Ich habe zuvor das folgende Snippet verwendet.
DECLARE @orig_lat DECIMAL
DECLARE @orig_lng DECIMAL
SET @orig_lat=53.381538 set @orig_lng=-1.463526
SELECT *,
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 #includeDistances
FROM #orig dest
Ich vertraue jedoch nicht den Daten, die daraus hervorgehen, es scheint etwas ungenaue Ergebnisse zu liefern.
Einige Beispieldaten für den Fall, dass Sie sie benötigen
Latitude Longitude Distance
53.429108 -2.500953 85.2981833133896
Könnte mir jemand mit meinem Code helfen, es macht mir nichts aus, wenn Sie das reparieren möchten, was ich bereits habe, wenn Sie einen neuen Weg haben, dies zu erreichen, der großartig wäre.
Bitte geben Sie an, in welcher Maßeinheit sich Ihre Ergebnisse befinden.
sql
sql-server
tsql
math
sql-server-2008-r2
Waller
quelle
quelle
Antworten:
Da Sie SQL Server 2008 verwenden, steht Ihnen der
geography
Datentyp zur Verfügung, der genau für diese Art von Daten ausgelegt ist:Gibt
Es ist ungefähr 538 km von (nahe) London nach (nahe) Edinburgh entfernt.
Natürlich wird es zuerst eine Menge zu lernen geben, aber sobald Sie es wissen, ist es weitaus einfacher, als Ihre eigene Haversine-Berechnung zu implementieren. Außerdem erhalten Sie eine Menge Funktionen.
Wenn Sie Ihre vorhandene Datenstruktur beibehalten möchten, können Sie sie weiterhin verwenden
STDistance
, indem Siegeography
mithilfe der folgendenPoint
Methode geeignete Instanzen erstellen :quelle
Die folgende Funktion gibt den Abstand zwischen zwei Geokoordinaten in Meilen an
Die folgende Funktion gibt den Abstand zwischen zwei Geokoordinaten in Kilometern an
Die unten Funktion gibt Abstand zwischen zwei Geokoordinaten in Kilometern mit Geographie - Datentyp , die in SQL Server 2008 eingeführt wurde
Verwendung:
Referenz: Ref1 , Ref2
quelle
Es sieht so aus, als ob Microsoft in die Gehirne aller anderen Befragten eingedrungen ist und sie dazu gebracht hat, so komplizierte Lösungen wie möglich zu schreiben. Hier ist der einfachste Weg ohne zusätzliche Funktionen / Deklarationsanweisungen:
Ersetzen Sie einfach Ihre Daten statt
LATITUDE_1
,LONGITUDE_1
,LATITUDE_2
,LONGITUDE_2
zB:quelle
Wenn Sie SQL 2008 oder höher verwenden, würde ich empfehlen, den Datentyp GEOGRAPHY zu überprüfen . SQL bietet Unterstützung für Geodatenabfragen.
Beispiel: In Ihrer Tabelle befindet sich eine Spalte vom Typ GEOGRAPHIE, die mit einer räumlichen Darstellung der Koordinaten gefüllt wird (Beispiele finden Sie in der oben verlinkten MSDN-Referenz). Dieser Datentyp stellt dann Methoden bereit, mit denen Sie eine ganze Reihe von Geodatenabfragen durchführen können (z. B. den Abstand zwischen zwei Punkten ermitteln).
quelle
Verwendung:
Wählen Sie dbo.DistanceKM (37.848832506474, 37.848732506474, 27.83935546875, 27.83905546875).
Ausgänge:
0,02849639
Sie können den @ R-Parameter mit kommentierten Floats ändern.
quelle
Zusätzlich zu den vorherigen Antworten können Sie hier die Entfernung innerhalb eines SELECT berechnen:
Verwendung:
Skalarfunktionen funktionieren ebenfalls, sind jedoch bei der Berechnung großer Datenmengen sehr ineffizient.
Ich hoffe das könnte jemandem helfen.
quelle