【问题标题】:Why is NaN returned from the euclidean method为什么从欧几里得方法返回NaN
【发布时间】:2011-11-08 14:40:40
【问题描述】:

这个函数有问题:

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 以及如何解决?

【问题讨论】:

  • 为什么要将参数分配给其他变量?

标签: php euclidean-distance


【解决方案1】:

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

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

【讨论】:

  • ...或者只是return sqrt(pow($lat2 - $lat1, 2) + pow($lon2 - $lon1, 2));...但是+1。
  • 非常感谢你。非常感谢您的回复..我现在明白了
【解决方案2】:

试试这个

function euclidean_method($lat1,$lon1,$lat2,$lon2) {
    $x = $lat1-$lat2;
    $y = $lon1-$lon2;
    return sqrt($x*$x+$y*$y)
}

【讨论】:

  • 非常感谢迈克尔。非常感谢您的回复
  • 没问题。只是一般注意pow或其在任何语言中的等效项通常比在平方时仅执行乘法效率低。 (即$x*$x 会比pow($x,2) 运行得更快)
  • 很高兴知道这一点。再次感谢迈克尔..我可以再问你一个问题吗?您知道如何将距离(返回值)转换为米吗?发送给函数的参数是两个非常接近的位置的坐标...
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    因为算法错误。

    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);
    }
    

    注意: (x12 - x22) 1 - x2)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 值,这可能是您正在搜索的距离;以公里为单位。

    这是exampleone more(基于this answer)。这是我用来验证该代码的service

    希望对您有所帮助! =)

    【讨论】:

    • 非常感谢 shybovycha。现在效果很好。我可以再问你一个问题吗?实际上,发送给函数的两个值是(经度和纬度)来计算这些非常近的位置之间的距离。您认为该距离的度量单位(返回值)是什么? (英里、公斤或米)??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2018-02-10
    • 2012-12-27
    • 2013-03-02
    相关资源
    最近更新 更多