Из-за неправильного алгоритма.
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
, которое, возможно, является расстоянием, которое вы ищете; измеряется в километрах.
Вот пример и еще один (на основе этого ответа ). А вот служба , которую я использовал для проверки этого кода.
Надеюсь, это поможет вам! =)