Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么从欧几里德方法返回NaN_Php_Euclidean Distance - Fatal编程技术网

Php 为什么从欧几里德方法返回NaN

Php 为什么从欧几里德方法返回NaN,php,euclidean-distance,Php,Euclidean Distance,我对此功能有问题: 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 $

我对此功能有问题:

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

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

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

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

通过在计算平方根之前平方,你保证只对正值进行操作。

问题是你的x值小于y的负值,因此它将成为你试图从中获取根的负值。

问题是你的x值小于y的负值,因此它将成为你试图获取的负值找根。

试试这个

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

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

因为一个错误的算法

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)<(x1-x2)2

这就是为什么您的代码给出了
x=float(0.00093541820670495)
y=float(-0.1175376299304)
。所以,
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_方法(1.5745103.6200,1.5748103.6195)
返回
0.0648375378577
值,这可能是您正在搜索的距离;以公里为单位

以下是和(基于)。这是我用来验证代码的方法


希望这对您有所帮助!=)

因为一个错误的算法

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)<(x1-x2)2

这就是为什么您的代码给出了
x=float(0.00093541820670495)
y=float(-0.1175376299304)
。所以,
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_方法(1.5745103.6200,1.5748103.6195)
返回
0.0648375378577
值,这可能是您正在搜索的距离;以公里为单位

以下是和(基于)。这是我用来验证代码的方法


希望这对您有所帮助!=)

为什么要将参数分配给其他变量?为什么要将参数分配给其他变量?…或者只是
返回sqrt(pow($lat2-$lat1,2)+pow($lon2-$lon1,2))。。。但是+1.非常感谢你的波尔卡盖斯特。非常感谢你的答复。。我现在明白了…或者只是
返回sqrt(pow($lat2-$lat1,2)+pow($lon2-$lon1,2))。。。但是+1.非常感谢你的波尔卡盖斯特。非常感谢你的答复。。我现在明白了,非常感谢你,迈克尔。非常感谢你的回复,没问题。请注意,
pow
或它在任何语言中的等价物在平方运算时通常比只执行乘法效率低。(也就是说,
$x*$x
将比
pow($x,2)
运行得更快)很高兴知道这一点。又来了,迈克尔。。我能再问你一个问题吗?您知道如何将距离(返回值)转换为米吗?发送到函数的参数是两个非常近位置的坐标…非常感谢Michael。非常感谢你的回复,没问题。请注意,
pow
或它在任何语言中的等价物在平方运算时通常比只执行乘法效率低。(也就是说,
$x*$x
将比
pow($x,2)
运行得更快)很高兴知道这一点。又来了,迈克尔。。我能再问你一个问题吗?您知道如何将距离(返回值)转换为米吗?发送到函数的参数是两个非常近位置的坐标…非常感谢shybovycha。它现在运行良好。我能再问你一个问题吗?实际上,发送到函数的两个值是(经度和纬度),用于计算这些非常接近的位置之间的距离。您认为该距离的度量单位(返回值)是多少?(英里、千克或米)??非常感谢shybovycha。它现在运行良好。我能再问你一个问题吗?实际上,发送到函数的两个值是(经度和纬度),用于计算这些非常接近的位置之间的距离。您认为该距离的度量单位(返回值)是多少?(英里、千克或米)??