сложная математика с большой формулой круга - PullRequest
0 голосов
/ 20 февраля 2010

У меня есть от местоположения (широта, долгота) и до местоположения (широта, долгота).После расчета, он должен показать мне, каким будет ближайший путь от использования компаса.Ниже приведен код PHP, который делает это, но он показывает неправильное направление, мне не нужна небольшая помощь в этом.

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

Ошибка при условии if: это значения в ifусловие функции greatCircleDirection, необходимо знать, что нужно изменить, чтобы исправить ее.

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

пример:

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 ]

1 голос
/ 20 февраля 2010

Ну, ваш расчет расстояния подтвердился. Но я вижу, что ответ, который вы получите для начального пеленга, будет (0 + 105) mod360, а не (0-105) mod360 (приблизительно), поэтому я подозреваю, что где-то в выражении if в вашей функции GreatCircleDirection указан неправильный знак.

1 голос
/ 21 февраля 2010

Вычисление расстояния не требуется; он просто добавляет больше операций и может вводить больше числовых ошибок. Используя ваш стиль кодирования, что-то вроде этого должно работать:

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 заботится об определении правильного квадранта для направления и дает вам угол между -180 и 180, измеренный от истинного севера, например, GreaterCircleDirection (39, -77,21,40) оценивается в 56,76 градуса. Используется условное обозначение: широты положительны на севере, отрицательные на юге; долготы положительны, когда восток, и отрицательны, когда запад.

Расчет обсуждается, в частности, в http://patriot.net/~abdali/ftp/qibla.pdf.

0 голосов
/ 20 февраля 2010

Возможно, помогут примеры, приведенные в разделе «Использование правила синуса» при http://www.krysstal.com/sphertrig.html.

...