Неточности со Сферическим Законом Косинусов ... конкретно по широте? - PullRequest
2 голосов
/ 09 марта 2012

У меня странная проблема с использованием формулы косинуса в моем PHP-приложении.

function CalculateDistanceCosine($decA, $decB)
{
    $lon1 = $decA[0]; //This would be equal to point A's longitude, and so on..
    $lat1 = $decA[1]; 
    $lon2 = $decB[0];   
    $lat2 = $decB[1];

    //echo $lon1." ".$lat1."<br/>";
    //echo $lon2." ".$lat2."<br/>";

    $distance  = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2-$lon1));
    $distance  = acos($distance);
    $distance  = rad2deg($distance);
    $distance  = $distance * 60 * 1.1515;
    $distance  = round($distance, 4);

    return $distance;   
}

Мой вклад в это будет выглядеть примерно так:

45.468055555556 -73.741388888889 //- The coordinates for Montreal International Airport
28.428888888889 -81.315833333333 //- Orlando International Airport

Однако при использованииэто, я получаю дикие ошибки .. то есть, «расстояние от Монреаля до Орландо составляет 576 км - очень неправильно».

Что интересно, это то, что оно очень точно вдоль оси долготы.Например, если я дал ввод:

50 -73.741388888889 
50 -81.315833333333 

Ошибка теперь составляет всего около 50 км, что очень приемлемо.

Другими словами, почему он пренебрегает разницей в широте?

Я, к сожалению, попробовал формулу Харвесина с похожими результатами.

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Я считаю, что ваша главная проблема в том, что вы путаете широту с долготой.Вы не показали нам неправильный код, но имейте в виду, что в ваших массивах сначала вам понадобится долгота, а затем широта, чтобы ваша функция работала.В приведенном вами примере вы сначала указали широту, а затем долготу.

Ваш код определенно определит расстояние между этими двумя точками, как записано в 576 (в единицах, которые я упомянучерез минуту), но на самом деле это не то место, о котором вы думаете :) Попробуйте изменить свою функцию следующим образом:

$lat1 = $decA[0]; //This would be equal to point A's *latitude*, and so on..
$lon1 = $decA[1]; 
$lat2 = $decB[0];   
$lon2 = $decB[1];

... или просто передайте значения в ожидаемом порядке.

Кроме того, я не узнаю ваш множитель расстояния, но, похоже, вы рассчитываете результат в милях, а не в километрах.Для километров попробуйте:

$distance  = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($lon2-$lon1));
$distance  = acos($distance);
$distance  = $distance * 6372.8;
$distance  = round($distance, 4);

(конвертируется только в градусы и множитель изменяется, базовая формула остается прежней.)

Учитывая указанные выше изменения, ваше расстояниеработает около 2 008 километров.Это примерно так?Боюсь, я никогда не бывал в Монреале, Орландо или где-то еще ...

0 голосов
/ 09 марта 2012

Вы смотрели здесь: Использование закона косинуса для вычисления расстояния между двумя точками в задаче C? ? После вычисления расстояния по закону косинуса расстояние не преобразуется в градусы, а умножается на радиус Земли. ИМО ты забыл радиус Земли.

...