GPS の位置は変動する可能性があります。受信した場所を実際にログに記録すると、場所の更新が来るたびに場所が実際に 2 メートル以上変化することがわかるでしょう。
編集:変動に対処するためのアイデアが追加されました:
GPS の変動に対処する方法は、アプリケーションのニーズによって異なります。いくつかの考えられるアイデアは次のとおりです。
本当に正確な位置情報が必要ない場合は、requestLocationUpdates()
通話でより高い距離制限を使用して、非常に小さな位置変更の更新を受信しないようにします。ユースケースで必要な絶対に必要な精度を考えてから、可能な限り高い距離制限を使用できます。
場所がすぐに変更されるとは思わない場合、または場所の変更にすぐに対応する必要がない場合は、requestLocationUpdates()
通話の制限時間を長くしてください。onLocationChanged()
これは、ネットワーク経由で常に何らかのデータをフェッチする場合 (リバース ジオコーディングなど)によってトリガーされる非常に重いコードがある場合にも意味があります。
制限時間は、バッテリーの使用量にも大きな影響を与えます。Android のドキュメントには次のように記載されています。
...場所プロバイダーが minDistance パラメーターを使用して電力を節約することはより困難であるため、バッテリー寿命を節約するための主要なツールは minTime である必要があります。
本当に正確な位置が必要な場合は、変動を減らす方法がいくつかあります。
まずLocation
、通常、受け取ったオブジェクトにはonLocationChanged()
、メソッドを呼び出すことで推定精度が得られますLocation.getAccuracy()
。(以前の位置更新の精度と比較して) 精度が非常に低い位置更新は無視できます。
最新の場所のバッファが短い場合は、フィルタリングを行うこともできます。平均を計算すると、突然の変化の量が減りますが、応答時間も長くなります。つまり、場所の急速な変化は、しばらくして初めて平均化された場所データに完全に現れます。(もちろん、平均化されたデータはすぐにその場所に向かって移動し始めますが、しばらく時間がかかります。) また、ある程度「スパイクを通過させます」。
高速な応答時間が重要であり、データ内の主要な「スパイク」を排除する必要がある場合は、中央値を計算する方が適切なオプションです。データの小さな変化をそれほど滑らかにすることはできませんが、ランダムなスパイクは除外できます。実際の (永続的な) 突然の場所の変化があった場合、メディアン フィルタリングは非常にわずかな遅延でそれに反応します。
(これらは、お気に入りのスプレッドシート アプリケーションで簡単に試すことができます。)