我有一个函数可以计算两个 GPS 坐标之间的距离。然后,我从数据库中获取所有坐标,并循环遍历所有坐标,以获得当前坐标与前一个坐标之间的距离,然后将其添加到特定 GPS 设备的数组中。由于某种原因,它返回 NaN。我尝试过将其转换为双精度型、整数型,并对数字进行四舍五入。
这是我的 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);
sin()
和cos()
的范围在 -1 和 1 之间。因此,在第一次计算$dist
时结果范围是 -2 到 2。然后将其传递给acos()
,其参数必须介于 -1 和 1 之间。例如,acos(2)
给出 NaN 。那里的其他所有内容也给出 NaN。我不确定公式应该是什么,但这就是你的 NaN 的来源。仔细检查你的三角函数。
您从数据库中提取的值可能是字符串,这会导致此问题。
您可能还想查看 Kolink 在他的帖子中提出的问题。