2016-11-02 12 views
0

私はスマートフォンデバイスでGPSを使用してユーザーの運転ルートを追跡することに大きく依存するアプリの保守と開発を担当しました。GPSがひどい経度番号を報告しているのはなぜですか?

問題は、GPS座標である(奇妙な程度に)不正確です。私は数百メートルについて話していない、私は数千メートルのように話している。私のクライアントはニュージーランドにあり、GPS座標はオーストラリア西部の海の中央にあります。

Sample of bad data

をあなたが見ることができるように、緯​​度の値が正しいように見えることが表示されます、または十分に正気:ここ

は電話が記録しているというのが私のクライアントから記録された不正なデータのサンプルです。しかし、経度の値はすべて100に固定されていますが、これは全く問題ありません。

技術アプリを使用して構築されてい

コルドバ - アンドロイド、5.22とコルドバ-IOS 4.2.1、しかし、我々は、Appceleratorのチタンのフレームワークを使用している我々のアプリの古いバージョンと同じ問題を見ています(再びニュージーランドのお客様のみ)、私はこの問題がコードワまたはチタンに固有のものではないと考えています。また、問題を再現することもできません(開発チームはカナダにあります)。

残念ながら、現時点では、クライアントがAndroidまたはiOSを使用しているかどうか、または使用しているOSのバージョンはわかりません。その情報が私に利用可能になるとすぐに質問を更新します。

アプリケーションは緯度/経度の値を読み取ってログファイルに書き込む以外は何も行いません。ログファイルはサーバーにアップロードされ、データは読み込まれ、MySQLデータベースに格納され、FLOATの長さ16 、14

コード コルドバアプリ:

geoWatchId = navigator.geolocation.watchPosition(logGeoItem, loggingFailure, {enableHighAccuracy: true}); 

... 

function logGeoItem(geoPoint){ 
if(loggingState.isLogging){ 
    console.log(JSON.stringify(geoPoint)); 
    var newLogItem = {latitude: geoPoint.coords.latitude, longitude: geoPoint.coords.longitude, heading: geoPoint.coords.heading, altitude: geoPoint.coords.altitude, created_datetime: Date.now()}; 
    loggingState.currentGeoLoggingData.push(newLogItem); 
} 

}

はい、watchPositionコードをw devicereadyイベントの中でラップした。 GPSデータは、MySQL DBに

for(var j=0; j<data.location.length; j++) { 
    var sqlLocation = "INSERT INTO location (session_id, heading, altitude, latitude, longitude, created_datetime) VALUES"; 
    sqlLocation += "('" + data.location[j].session_id + "','" + data.location[j].heading + "','" + data.location[j].altitude + "','" + data.location[j].latitude + "','" + data.location[j].longitude + "','" + data.location[j].created_datetime + "');"; 
    connection.query(sqlLocation, function(err, result){ 
     log.info(err); 
     log.info(result); 
     if(err) { 
     connection.rollback(function(){ 
      callback({ result: 'error', errorMsg: constants.errors.ERROR_UPLOAD_LOCATION_DATA }); 
     }); 
     } 
    }); 
    } 

を格納

NodeJS研究

私はネットを通じてクロールや不正確なGPSの位置を説明するいくつかの異なった記事やスタックオーバーフローの記事を見つけましたが、これらのきGPSがまだどこに潜んでいるかを説明する。

手の問題は、経度の値が完全に正気であるということである、と経度値は100

で一貫ように見える私は経度が調子が悪い、これまでである理由を示す何かを発見していない、となぜそれは一貫して100です。私の問題が実際には不正確な読みであった場合、私は100の定数ではなく、さまざまな経度の値を期待しています。

誰でもデバッグを進める方法に関する提案を私に提供できますか?なぜ、経度だけが100に固定されるのでしょうか?

+1

あなたの質問には関係ありませんが、あなたのコードはSQLインジェクション攻撃の影響を受けやすいです。 SQLクエリを設計するときは、データバインディングを使用する必要があります: 'var sqlLocation =" INSERT INTO location(session_id、heading、altitude、latitude、longitude、created_datetime)VALUES(?、?、?、?、?、?); ja .latitude、data.location [j] .longitude、data.location [j] data.location [j] .created_datetime]; –

+0

どの変数から(つまり、 –

+0

私の問題は解決しましたが、問題は実際にはmysqlデータベースのテーブル設定のために発生したデータストアの問題でした。私は以下の答えを投稿しました。それに応じて質問タグも更新します。 –

答えて

2

問題は経度の値がMySQLで設定された最大許容桁数を実際に超えていることです。

FLOAT (16,14)

あなたは小数点以下の桁に属する14そのうち16桁の最大を持つことができることを意味します。例えば、ニュージーランドの

部品が潜在的に持つことができる経度値> = 100 、ガレイノースランド、ニュージーランドは:-35.725043、16/14ルールを破る数(偶数である174.319490

174.319490ため小数点の後に14桁の数字が含まれていない場合は、100でキャッピングしてゼロ充填しているように見えます)。

テーブルを小数点より前の3桁目を許可するタイプFLOAT (17,14)に変更すると、データは正しく保存されます。

テスト済みMySQL 5.6.21

関連する問題