2016-07-20 10 views
0

入力位置とデータベース上の距離が50キロメートル未満の場合、文字列に連結GPS位置を表示しようとしています。これを行うには、2つの場所の緯度と経度のパラメータを持つ関数距離($ lat1、$ lon1、$ lat2、$ lon2、$ unit)を使用します。この関数は多くの場合うまく機能しているようですが、時には文字列の出力(点間の距離)としてNANが得られます。私はそれが入力の機能かどうかを引き起こしているのか分からない。以下のコードとサンプル入力を確認してください。 PS:$ dateは入力場所の緯度です。2つのGPS位置の間の距離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; 
    } 
} 

サンプル入力:gpslong=101.1020&gpslat=11.1241 出力:NANNANNAN872.77757900898

+1

すぐにmysql_関数を使用してください。 PHP 5.5では廃止され、PHP 7では削除されました。代わりに 'mysqli_'関数または' PDO'を使用してください。 – Chris

+1

ほとんどの正確な複製:http://stackoverflow.com/questions/8696755/php-returning-nan –

+0

Sidenote:MySQL 5.6.1 +には、必要なものを正確に実行する 'ST_DISTANCE'があります(あなたのlong /ラティスからジオメトリ)。 https://dev.mysql.com/doc/refman/5.6/ja/spatial-analysis-functions.htmlをチェックすると、多くの問題を軽減できます。 – apokryfos

答えて

0

はNaN値の理由は、入力およびデータベースGPS位置間の0の差でした。私はそれらを別々に扱った。

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

となります。また、MysqliやpdoをPHP 5.5で廃止され、PHP 7以降ではサポートされないようにすることをお勧めします。

関連する問題