1

我有这个功能的问题:

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。谁能告诉我为什么NaN返回以及如何解决它?

4

4 回答 4

7

$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;

通过在计算平方根之前进行平方,您可以保证仅对正值进行操作。

于 2011-11-08T14:45:13.380 回答
1

尝试这个

function euclidean_method($lat1,$lon1,$lat2,$lon2) {
    $x = $lat1-$lat2;
    $y = $lon1-$lon2;
    return sqrt($x*$x+$y*$y)
}
于 2011-11-08T14:45:30.307 回答
0

问题是您的 x 值小于您的 y 的负值,因此它将成为您试图根除的负值。

于 2011-11-08T14:45:17.187 回答
0

因为算法错误。

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 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值,这可能是您正在搜索的距离;以公里为单位。

这是示例另一个(基于此答案)。这是我用来验证该代码的服务。

希望对你有帮助!=)

于 2011-11-08T14:46:29.637 回答