Wie berechne ich den Azimuth (Winkel nach Norden) zwischen zwei WGS84-Koordinaten in einer einzigen T-SQL-Abfrage?
-
20-08-2019 - |
Frage
fand ich für diese Frage die Lösung in C # , aber ich kann es zu einer einzigen Abfrage T-SQL nicht übersetzen, da meine C # -Implementierung Verzweigung erfordert (if then else).
Ich fand auch die folgenden C #-Lösung, die auf einer einzigen Abfrage T-SQL übersetzt werden könnte, aber es produziert nicht die richtigen Ergebnisse
public static double GetAzimuth(WGSCoord c1, WGSCoord c2) {
var lat1 = DegToRad(c1.Latitude);
var lon1 = DegToRad(c1.Longitude);
var lat2 = DegToRad(c2.Latitude);
var lon2 = DegToRad(c2.Longitude);
return RadToDeg(Math.Asin(Math.Sin(lon1 – lon2) * Math.Cos(lat2) / Math.Sin(Math.Acos(Math.Sin(lat2) * Math.Sin(lat1) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 – lon1)))));
}
-Code von Tamir Khason - Just Code
Könnte jemand korrigieren Sie den Code oben oder bieten eine alternative Lösung?
Lösung
Ersetzen ifs mit CASE-Ausdrücke:
if (latitudinalDifference == 0)
{
if (longitudinalDifference != 0)
{
azimuth = Math.PI / 2d;
}
}
ersetzen mit:
SELECT CASE WHEN @latitudinalDifference = 0 AND @longitudinalDifference <> 0 THEN ...
ELSE ... END AS azimuth
ersetzt konsekutiven ifs mit verschachtelten Selects:
if(some condition)
{
i=1;
}
else
{
i=2;
}
if(some other condition)
{
i++;
}
ersetzen
SELECT i + CASE WHEN (some other condition) THEN 1 ELSE 0 END
FROM(
SELECT CASE WHEN (some condition) THEN 1 ELSE 2 END AS i
) AS t
Andere Tipps
Haben Sie darüber nachgedacht, einen Montage mit einem SP in C # für sQL Server? Das ist der Weg würde ich wahrscheinlich gehen.
Es gibt eine ganze Menge der notwendigen sphärischen Trigonometrie in der Antwort auf SO 389211 . Kopieren und Modifizieren, was ich schrieb es:
Betrachten wir ein sphärisches Dreieck mit Winkeln A , B , C an den Ecken und an den Seiten a , < em> B , c gegenüber diesen Eckpunkten (das heißt, Seite a ist von B bis C , etc.). Angewandt auf das Problem, können wir die beiden Punkte nennen gegeben B und C , und wir schaffen ein Recht sphärisches Dreieck mit einem rechten Winkel in A .
Betrachten Sie dieses Diagramm:
+ C
/|
/ |
a / | b
| / |
|X/ |
|/ |
B +------+ A
c
Sie gegeben sind zwei Punkte B und C , und Sie wollen, um den Winkel bestimmen X = 90 ° - B. Die Seite c ist auf die Differenz in der Länge, Δλ gleich; die Seite b ist gleich der Differenz in der Breite, Δφ; der Winkel A ist 90º, so sin A = 1 und cos A = 0. X Um zu bestimmen, wir wollen, dass der Wert von B gegeben b c und A .
Mit Blick auf das Problem von Grund auf, müssen wir die beiden Haupt sphärischen Trigonometrie Gleichungen:
-
Die Sinus-Formel:
sin A sin B sin C ----- = ----- = ----- sin a sin b sin c
-
Die Cosinus Formel:
cos a = cos b . cos c + sin b . sin c . cos A
Deshalb glaube ich, eine Gleichung für a ist:
cos a = cos Δλ . cos Δφ + sin Δλ . sin Δφ . cos 90º
a = arccos (cos Δλ . cos Δφ)
Da a b und A können wir die Sinus-Formel verwenden, um zu bestimmen B :
sin a sin b
----- = ----
sin A sin B
oder
sin b . sin A
sin B = -------------
sin a
Oder, da A = 90 °, sin A = 1 und sin B = sin (90º - X) = cos X:
sin b
cos X = -----
sin a
ich eher, dass vermute, wenn ich meinen Verstand zu ihm gebogen (oder Sie beugte sich nur ordentlich), könnten Sie mit einer Antwort kommen, die nicht beinhaltete arccos gefolgt von sin.
In T-SQL, können Sie den CASE-Ausdruck verwenden
z.
SELECT ...
CASE
WHEN latD = 0 AND longD < 0 THEN ....
WHEN latD < 0 AND longD = 0 THEN ....
etc.