Почему NaN возвращается из евклидова метода - PullRequest
1 голос
/ 08 ноября 2011

У меня проблема с этой функцией:

function encludean_method($lat1,$lon1,$lat2,$lon2)
{
    $x1 = $lat1;
    $y1 = $lon1;
    $x2 = $lat2;
    $y2 = $lon2;
    $x = ( pow($x2,2) - pow($x1,2));
    $y = ( pow($y2,2) - pow($y1,2));
    $distance = (sqrt($x + $y));
    return $distance;
}

Проблема, когда я вызываю вышеуказанную функцию с некоторыми значениями, такими как

(1.57454123333,103.6200516333,1.57483825,103.619484475)

.Кто-нибудь может подсказать, почему возвращается NaN и как его решить?

Ответы [ 4 ]

7 голосов
/ 08 ноября 2011

$ x и $ y могут принимать отрицательные значения (что на самом деле происходит в вашем примере), что в итоге дает отрицательное выражение для $ x + $ y. Я не уверен, правильно ли то, что вы делаете, не будет ли правильная версия более похожа на:

$x1 = $lat1;
$y1 = $lon1;
$x2 = $lat2;
$y2 = $lon2;
$x = $x2 - $x1;
$y = $y2 - $y1;
$distance = (sqrt(pow($x, 2) + pow($y, 2)));
return $distance;

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

1 голос
/ 08 ноября 2011

Попробуйте это

function euclidean_method($lat1,$lon1,$lat2,$lon2) {
    $x = $lat1-$lat2;
    $y = $lon1-$lon2;
    return sqrt($x*$x+$y*$y)
}
0 голосов
/ 08 ноября 2011

Из-за неправильного алгоритма.

function encludean_method($lat1,$lon1,$lat2,$lon2)
{
    $x1 = doubleval($lat1);
    $y1 = doubleval($lon1);
    $x2 = doubleval($lat2);
    $y2 = doubleval($lon2);

    $x = doubleval( pow($x2 - $x1, 2.0));
    $y = doubleval( pow($y2 - $y1, 2.0));

    $distance = doubleval(sqrt($x + $y));

    return ($distance);
}

Примечание: (x 1 2 - x 2 2 ) <(x <sub>) 1 - x 2 ) 2 .

Вот почему ваш код дал x = float(0.00093541820670495) и y = float(-0.11753762299304). Итак, sqrt(x + y) слишком близко к нулю.

Но если вы пытаетесь определить расстояние между этой точкой над поверхностью Земли, вам следует использовать другую формулу - та, которую вы используете, применима только для декартовой системы координат.

Обратите внимание, что широта и долгота измеряются в градусах. Таким образом, число, которое вы получаете, немного загадочно =)

Итак, немного погуглив, я заметил несколько интересных сервисов и формул. Вот код, который вы, возможно, пытаетесь вызвать:

function encludean_method($lat1, $lon1, $lat2, $lon2)
{
    $R = 6372.8; // km

    $lat1 = deg2rad($lat1);
    $lat2 = deg2rad($lat2);
    $lon1 = deg2rad($lon1);
    $lon2 = deg2rad($lon2);

    $a = (cos($lat2) * cos($lon2)) - (cos($lat1) * cos($lon1));
    $b = (cos($lat2) * sin($lon2)) - (cos($lat1) * sin($lon1));
    $c = sin($lat2) - sin($lat1);
    $ch = sqrt(pow($a, 2.0) + pow($b, 2.0) + pow($c, 2.0));
    $phi = 2.0 * asin($ch / 2.0);

    return $R * $phi;
}

Теперь encludean_method(1.5745, 103.6200, 1.5748, 103.6195) возвращает значение 0.0648375378577, которое, возможно, является расстоянием, которое вы ищете; измеряется в километрах.

Вот пример и еще один (на основе этого ответа ). А вот служба , которую я использовал для проверки этого кода.

Надеюсь, это поможет вам! =)

0 голосов
/ 08 ноября 2011

Проблема в том, что ваше значение x меньше отрицательного значения вашего y, и, таким образом, оно станет отрицательным значением, от которого вы пытаетесь получить корень.

...