PHP Rückgabe NaN
Ich habe eine Funktion, die berechnet die Entfernung zwischen zwei GPS-Koordinaten. Ich bekomme dann die Koordinaten aus der Datenbank und Schleife durch Sie alle zu bekommen, die Entfernung zwischen der aktuellen und der vorherigen, dann fügen Sie, dass ein array für die spezifischen GPS-Gerät. Für einige Grund, es ist return NaN. Ich habe versucht, Gießen Sie ein Doppel -, ein int, und die Rundung der Zahl.
Hier ist mein PHP code:
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);
- Können Sie zeigen im detail, was schief geht-Wann genau?
- sind Sie sicher, dass die Werte u get aus der Datenbank sind zahlen, keine Zeichenketten?
- Ich würde empfehlen, in der debugging-Ausgabe auf jeder Stufe der Entfernung () - Formel, herauszufinden, WO genau die nan produziert wird.
- Diese Linie sicher scheint lustig:
$dist[$row['imeiN']][]["lat"] = $row['lat'];
-- wie ist der Dolmetscher eigentlich wissen was zu tun ist, die leere Menge von[]
array-Indizes? Ich bin überrascht, dass es nicht nur stimmt es. - das ist eine normale PHP-Funktion Anhängen. Er dann bekommen die count () - kennen die indize, die ist hässlich. Ein sehr einfacher Ansatz wäre die Verwendung eines Zählers, er ist, hat er zu Schichten...
- Danke Mann, ich hatte Ihnen in der Datenbank als VARCHARs. Nochmals vielen Dank 🙂 Wie markiere ich ein Kommentar als eine Antwort
- gepostet beantworten
- Wenn Sie eine leere index wie
$array[] = "Whatever"
es fügt es an das array an der ersten verfügbaren numerischen index, nachdem man Sie verwendet. Also wenn du ein array mit Indizes 0 oder 1 und 3, dann$array[] = "Whatever"
gehen in den index 4. Es ist eine grausame Methode, aber mit dem tun der Graf und alle. Ich würde vorschlagen, (wie Alexis) ein Zähler erhöht variable um zu verfolgen, was index es sollte eingefügt werden ($i=0;
außerhalb der während$i++;
innen am Ende der Zeit, und mit$i
als den unbestimmten index, wenn die Speicherung der Variablen)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Werten, die Sie ziehen aus der Datenbank kann es sich um strings, was wäre dieses Problem verursachen.
Können Sie auch prüfen wollen, die Probleme, die Kolink hob in seinem Beitrag.
Bereich von
sin()
undcos()
ist zwischen -1 und 1. Also deine erste Berechnung von$dist
den Ergebnis-Bereich ist -2 zu 2. Sie übergeben dann diese zuacos()
, deren argument muss zwischen -1 und 1. Soacos(2)
zum Beispiel gibt NaN. Alles andere, was von dort gibt NaN als gut.Ich bin mir nicht sicher, was die Formel genau, aber das ist, wo Sie Ihr NaN aus. Überprüfen Sie Ihre Trigonometrie.
Den algo produzieren NaN wenn die Punkte zu dicht nebeneinander. In diesem Fall wird $dist bekommt Wert 1. acos(1) ist NaN. Alle sunsequent Berechnungen erzeugen NaN zu.
Sie Runden Koordinaten wie der erste Schritt, so macht es wahrscheinlicher, dass die Werte werden gleich nach der Rundung, und produzieren NaN
Ist, dass die sphärische Gesetz der Cosinus Sie verwenden? Ich würde wechseln Sie zu der Haversine-Formel:
Sollten Sie in der Lage sein, um Sie verändern die Erde hat einen radius auf jegliche form der Messung von radius in Lichtjahren radius in Nm und Holen Sie sich die richtige Anzahl zurück, die für die Einheit verwendet.
Danke für die vielen Antworten hier - als ein Ergebnis, ich habe eine Funktion, die vereint, um Berechnungen und tests für NaN im einzelnen, wenn die beiden nicht NaN - es Durchschnittswerte die Berechnung, wenn man " NaN " und der andere nicht - es verwendet die eine, die gültig ist und gibt Fehler-Bericht für die Koordinaten, die fehlgeschlagen ist einer der Berechnung:
HTH jemand in die Zukunft.