сложная математика с формулой большого круга

У меня есть от местоположения (широта, долгота) и до местоположения (широта, долгота). После расчета он должен показать мне, какой ближайший путь можно пройти с помощью компаса. Ниже приведен 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)

person Basit    schedule 20.02.2010    source источник


Ответы (3)


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

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.

person Kamal Abdali    schedule 21.02.2010

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

person High Performance Mark    schedule 20.02.2010
comment
да, вы правы, если условие неправильное... можете ли вы помочь мне исправить это, я понятия не имею, что делать, чтобы это исправить. - person Basit; 20.02.2010
comment
это если условие: (0,57700585070933 ‹ 3,1415926535898 и 0,57700585070933 ‹ 0) или (0,57700585070933 › 3,1415926535898 и 0,57700585070933 › 0) - person Basit; 20.02.2010
comment
я должен изменить больший и меньший знаки напротив? это сработает? но в основном, будет ли это правильным при расчете? - person Basit; 20.02.2010

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

person M. S. B.    schedule 20.02.2010