Frage

Ich habe einen von Ort (Breitengrad, Längengrad) und Lage (Breitengrad, Längengrad). Nach der Berechnung, sollte es mir zeigen, was der nächste Weg von der Verwendung eines Kompasses zu gehen wäre. Im Folgenden ist PHP-Code, das zu tun, aber es ist die falsche Richtung zeigt, ich brauche etwas Hilfe zu diesem Thema.

function GreatCircleDirection ($OrigLat, $DestLat, $OrigLong, $DestLong, $Distance)
{
    $Result = 0.0;

    $L1 = deg2rad($OrigLat);
    $L2 = deg2rad($DestLat);
    $D = deg2rad($Distance / 60); # divide by 60 for nautical miles NM to degree

    $I1 = deg2rad($OrigLong);
    $I2 = deg2rad($DestLong);
    $Dlong = $I1 - $I2;

    $A = sin($L2) - cos($D + $L1 - pi() / 2);
    $B = acos($A / (cos($L1) * sin($D)) + 1);

    if ((abs($Dlong) < pi() and $Dlong < 0) or (abs($Dlong) > pi() and $Dlong > 0))
    {
        //$B = (2 * pi()) - $B;
    }

    $Result = $B;
    return rad2deg($Result);
}


function GreatCircleDistance ($OrigLat , $DestLat, $OrigLong, $DestLong)
    {
        $L1 = deg2rad($OrigLat);
        $L2 = deg2rad($DestLat);
        $I1 = deg2rad($OrigLong);
        $I2 = deg2rad($DestLong);

        $D = acos(cos($L1 - $L2) - (1 - cos($I1 - $I2)) * cos($L1) * cos($L2));
        # One degree of such an arc on the earth's surface is 60 international nautical miles NM
        return rad2deg($D * 60);
    }

Bug auf, wenn die Bedingung: dies sind die Werte in der, wenn die Bedingung der greatCircleDirection Funktion, müssen wissen, was es zu beheben zu ändern.

if (0.57700585070933 < 3.1415926535898 and 0.57700585070933 < 0) or (0.57700585070933 > 3.1415926535898 and 0.57700585070933 > 0)

Beispiel:

from lat: 33.71, 
to lat: 21, 
from long: 73.06, 
to long: 40 , 
distance: 1908.842544944
direction 104.96527938779  (direction should be 255.87 or so)
War es hilfreich?

Lösung

, um den Abstand Computing ist nicht erforderlich; es fügt einfach mehr Operationen und mehr numerische Fehler können einleitet. Arbeiten mit dem Stil der Codierung, so etwas wie dies funktionieren soll:

function GreatCircleDirection($OrigLat, $OrigLong, $DestLat, $DestLong)
{   
   $L1 = deg2rad($OrigLat);
   $I1 = deg2rad($OrigLong);
   $L2 = deg2rad($DestLat);
   $I2 = deg2rad($DestLong);
   return rad2deg(atan2((sin($I2-$I1),cos($L1)*tan($L2)-sin($L1)*cos($I2-$I1)));
}

Die atan2 Funktion übernimmt die richtigen Quadranten für die Richtung zu identifizieren, und gibt den Winkel zwischen -180 bis 180, gemessen vom wahren Norden, z.B. GreaterCircleDirection (39, -77,21,40) Wertet bis 56,76 Grad. Vorzeichenkonvention verwendet: Breiten sind positiv, wenn nach Norden, negativ, wenn nach Süden; Longituden sind positiv, wenn Osten, negativ, wenn Westen.

Die Berechnung wird diskutiert in, unter anderem, http://patriot.net/ ~ Abdali / ftp / qibla.pdf .

Andere Tipps

Nun, Ihre Entfernungsberechnung Kontrollen. Aber ich sehe, dass die Antwort, die Sie für das erste Lager erhalten ist (0 + 105) mod360 statt (0-105) mod360 (ungefähr), damit ich ein falsches Zeichen irgendwo in der if-Anweisung in Ihrer GreatCircleDirection Funktion vermuten.

Vielleicht ist die Arbeitsbeispiele, unter "Verwendung der Sinus-Regel", unter http: //www.krysstal .com / sphertrig.html helfen.

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