こんにちは、インターネット接続なしで地理的位置を取得できるかどうか知りたいです。ネットに接続していないとしますが、GPS はオンになっています。
navigator.geolocation.getCurrentPosition(successCallback, errorCallback,
{
enableHighAccuracy : true,
timeout : 10000, // 10s
maximumAge : 0
}
このシナリオで作業する
こんにちは、インターネット接続なしで地理的位置を取得できるかどうか知りたいです。ネットに接続していないとしますが、GPS はオンになっています。
navigator.geolocation.getCurrentPosition(successCallback, errorCallback,
{
enableHighAccuracy : true,
timeout : 10000, // 10s
maximumAge : 0
}
このシナリオで作業する
Android アプリケーションの場合、http: //www.offlinegeolocation.com からダウンロード可能な Android ライブラリを使用できます。これは無料ですが、非常に大きい (全世界で 240 MB、英国のみで 10 Mb)。既知のセル タワーの位置を使用し、これを検出された近くのセル タワーと比較します。GPS やオンライン ジオロケーションほど正確ではありませんが、フェールオーバーとしてのニーズに適している可能性があります。
これを Phonegap で使用するには、Phonegap プラグインに変換する必要があります。これに関する優れたチュートリアルがここにあります: http://devgirl.org/2013/07/17/tutorial-how-to-write-a-phonegap-plugin-for-android/
phonegap アプリを (Android で) 開発しているときに、enableHighAccuracy を使用しても常に正確な位置が返されるとは限らないことがわかりました。オペレーティング システムは、数百メートルの精度で低精度の位置を返す場合があります。ネットワーク三角測量を使用するか、または場所を特定するためのインターネット接続。
また、アプリの実行中に GPS フィックスを失うと、OS が不正確な位置を返すことがあります。私の知る限り、successCallback() に返された位置がどの方法で取得されたかを知る方法はありませんが、successCallback() に返された応答オブジェクトの精度値を調べて、これを推測しました。最小必要精度を 50 メートルに設定しました。返された位置がこれよりも正確でない場合は、無視します。
このテスト ケースを試して、デバイスが返す精度を確認してください。navigator.geolocation.getCurrentPosition() は位置を 1 回しか返さないため、navigator.geolocation.watchPosition() を使用しています。お役に立てれば!
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Geolocation test</title>
<script type="text/javascript" src="phonegap.js"></script>
<script type="text/javascript" src ="jquery-1.7.1.min.js"></script>
<script type="text/javascript" >
$(document).on("deviceready", function() {
var minimumAccuracy = 50; // Minimum accuracy in metres to accept as a reliable position
function successCallback(position){
$('#error').html('');
$('#lat').html(position.coords.latitude);
$('#lon').html(position.coords.longitude);
$('#accuracy').html(position.coords.accuracy);
$('#accurate').html(position.coords.accuracy > minimumAccuracy ? "true" : "false");
}
function errorCallback(error){
$('#lat').html(''); $('#lon').html(''); $('#accuracy').html(''); $('#accurate').html('');
$('#error').html("Error while retrieving current position. <br/>Error code: " + error.code + "<br/>Message: " + error.message);
}
navigator.geolocation.watchPosition(successCallback, errorCallback, {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0
});
});
</script>
</head>
<body>
<p>Latitude: <span id="lat"></span></p>
<p>Longitude: <span id="lon"></span></p>
<p>Accuracy: <span id="accuracy"></span></p>
<p>Accurate?: <span id="accurate"></span></p>
<hr/>
<p>Error: <span id="error"></span></p>
</body>
</html>