我有一個函數可以計算兩個 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 在他的帖子中提出的問題。