我对这个函数有一个问题:
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;
通过在计算平方根之前进行平方,可以保证只对正值进行操作。
试试这个
function euclidean_method($lat1,$lon1,$lat2,$lon2) {
$x = $lat1-$lat2;
$y = $lon1-$lon2;
return sqrt($x*$x+$y*$y)
}
问题是你的x值小于负的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);
}
注意: (x <子> 1 子><一口> 2> 2 <一口> 2> - 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
的值,这可能是你正在搜索的距离;以千米计
这是一个例子,还有一个(基于这个答案)。下面是我用来验证代码的服务。
希望这对你有帮助!div =)