büyük daire formülü ile karmaşık matematik

3 Cevap php

Ben bir from location (enlem, boylam) ve to location (enlem, boylam). Hesaplandıktan sonra, bir pusula kullanarak gitmek için en yakın yolu ne olurdu bana göstermelidir. Aşağıdaki yapmak için PHP kodu olduğunu, ama onun yanlış yönü gösteren, ben bu konuda biraz yardıma ihtiyacım var.

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 on if condition: this is the values in the if condition of greatCircleDirection function, need to know what to change to fix it.

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

example:

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)

3 Cevap

Mesafenin hesaplanması gereksizdir; sadece daha fazla işlemleri ekler ve daha fazla sayısal hataları tanıttı olabilir. Kodlama stilini kullanarak, böyle bir şey çalışması gerekir:

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

Atan2 işlevi yöne doğru kuadrantı belirlenmesi ilgilenir ve size 56.76 derece değerlendirir true, örneğin Kuzey, GreaterCircleDirection (39, -77,21,40) ölçülen 180 -180 arasındaki açıyı verir. Burcu kongre kullandı: enlemlerde zaman kuzey, negatif olduğunda güney olumlu; boylamları, doğu zaman pozitif, negatif olduğunda batısında bulunmaktadır.

Hesaplama, diğer yerler arasında, tartışılmaktadır http://patriot.net/~abdali/ftp/qibla.pdf.

Peki, mesafe hesaplama denetler. Ama ilk rulman için olsun cevap (0 +105) mod360 ziyade (0-105) mod360 (yaklaşık) olduğunu görmek bu yüzden yere GreatCircleDirection işlevi eğer deyimi yanlış bir işaret sanıyorum.

Belki de, "Sinüs Kural kullanma" altında çalıştı örnekler, http://www.krysstal.com/sphertrig.html yardımcı olacaktır.