2016-07-20 11 views
0

Ich versuche verkettete GPS-Positionen in einer Zeichenfolge anzuzeigen, wenn der Abstand zwischen dem Eingabeort und dem in der Datenbank weniger als 50 km beträgt. Dazu benutze ich einen Funktionsabstand ($ lat1, $ lon1, $ lat2, $ lon2, $ unit), der die Parameter für den Breiten- und Längengrad der beiden Orte enthält. Diese Funktion scheint in vielen Fällen gut zu funktionieren, aber ich bekomme manchmal eine NAN als Ausgabe (Abstand zwischen Punkten) in der Zeichenfolge. Ich weiß nicht, was es verursacht, ob die Funktion der Eingabe. Bitte überprüfen Sie meinen Code und Beispiel Eingabe-Ausgabe unten. PS: $ date ist die Breite des Eingabestandorts.Entfernung zwischen 2 GPS-Standorten PHP

function getGPS($date,$gps){ 

    $stringa=""; 
    $connx = mysql_connect($dbhost, $dbuser, $dbpass); 

    if(! $connx) { 
     die('Could not connect: ' . mysql_error()); 
    } 

    $sqlx = 'SELECT gpslat,gpslong FROM whosonline'; 
    mysql_select_db('revietbw_reviewitappDB'); 
    $retvalx = mysql_query($sqlx, $connx); 

    if(! $retvalx) { 
     die('Could not get data: ' . mysql_error()); 
    } 

    while($row = mysql_fetch_assoc($retvalx)) { 
     $glat=(float)$row['gpslat']; 
     $glong=(float)$row['gpslong']; 

     $dis=distance((float)$date, (float)$gps, $glat, $glong, "K"); 
     echo $dis; 
     if($dis<100){ 
      $stringa = $stringa . ":" . $glat . " " . $glong; 
     } 

    } 

    //echo "Fetched data successfully\n"; 

    mysql_close($connx); 
    return $stringa; 
} 

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

    $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; 
    $unit = strtoupper($unit); 

    if ($unit == "K") { 
     return ($miles * 1.609344); 
    } else if ($unit == "N") { 
     return ($miles * 0.8684); 
    } else { 
     return $miles; 
    } 
} 

Probe Input: gpslong=101.1020&gpslat=11.1241 Ausgang: NANNANNAN872.77757900898

+1

Bitte beenden Sie die mysql_ Funktionen sofort. Sie sind in PHP 5.5 veraltet und in PHP 7 entfernt worden. Verwenden Sie stattdessen 'mysqli_' -Funktionen oder 'PDO'. – Chris

+1

Fast ein exaktes Duplikat von: http://StackOverflow.com/Questions/8696755/PHP-ReTurning-Nan –

+0

Hinweis: MySQL 5.6.1 + hat 'ST_DISTANCE', die genau das tun würden, was Sie brauchen (vorausgesetzt, Sie konvertieren Ihre lange/lat zu Geometrien). Überprüfen Sie https://dev.mysql.com/doc/refman/5.6/en/spatial-analysis-functions.html es kann Ihnen eine Menge Ärger ersparen. – apokryfos

Antwort

0

Der Grund für die NAN-Werte war die 0 Differenz zwischen den Eingangs- und Datenbank GPS-Standorte. Ich habe sie getrennt behandelt.

if($dis<100 &$dis!='NAN'){ 
    $stringa = $stringa . ":". $unz . " " . $glat . " " . $glong; 
    } 

würde die Aufgabe erledigen. Zusätzlich würde ich auch Mysqli oder PDO empfehlen, da es in PHP 5.5 veraltet ist und in höheren PHP 7 nicht unterstützt wird.