Wie berechne ich den Azimuth (Winkel nach Norden) zwischen zwei WGS84-Koordinaten in einer einzigen T-SQL-Abfrage?

StackOverflow https://stackoverflow.com/questions/1050950

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?

War es hilfreich?

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:

  1. Die Sinus-Formel:

    sin A   sin B   sin C
    ----- = ----- = -----
    sin a   sin b   sin c
    
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top