【发布时间】:2012-01-02 01:27:19
【问题描述】:
我有一个函数可以计算两个 GPS 坐标之间的距离。然后我从数据库中获取所有坐标并循环遍历它们以获得当前坐标与前一个坐标之间的距离,然后将其添加到特定 GPS 设备的数组中。出于某种原因,它返回 NaN。我尝试将其转换为 double、int 和四舍五入。
这是我的 PHP 代码:
function distance($lat1, $lon1, $lat2, $lon2) {
$lat1 = round($lat1, 3);
$lon1 = round($lon1, 3);
$lat2 = round($lat2, 3);
$lon2 = round($lon2, 3);
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
if($miles < 0) $miles = $miles * -1;
return ($miles * 1.609344);
}
$this->db->query("SELECT * FROM `gps_loc` WHERE `imeiN`='" . $sql . "' AND `updatetime`>=$timeLimit ORDER BY `_id` DESC");
$dist = array();
$dist2 = array();
while($row = $this->db->getResults()) {
$dist2[$row['imeiN']] = 0;
$dist[$row['imeiN']][]["lat"] = $row['lat'];
$dist[$row['imeiN']][count($dist[$row['imeiN']]) - 1]["lng"] = $row['lon'];
}
foreach($dist as $key=>$d) {
$a = 0;
$b = 0;
foreach($dist[$key] as $n) {
if($a > 0) {
$dist2[$key] += $this->distance($n['lat'], $n['lng'], $dist[$key][$a - 1]['lat'], $dist[$key][$a - 1]['lng']);
}
$a++;
}
}
echo json_encode($dist2);
【问题讨论】:
-
你能更详细地说明什么时候出了问题吗?
-
你确定你从数据库中得到的值是数字而不是字符串?
-
我建议在你的 distance() 公式的每个阶段都加入调试输出,找出产生 nan 的确切位置。
-
这一行确实看起来很有趣:
$dist[$row['imeiN']][]["lat"] = $row['lat'];——解释器应该如何知道如何处理那组空的[]数组索引?我很惊讶它并没有直接退出。 -
@sarnold 这是要附加的普通 PHP 功能。然后他让 count() 知道指数,这是丑陋的。一个非常简单的方法是使用计数器,他必须分层......