ユーザーの移動中にマップ上のパスをペイントするために、reactネイティブプロジェクトでnavigator.geolocation.watchPositionを使用しています。この関数の戻り周波数が非常に低いことに気付きました。 iOSエミュレーターとgpsエミュレーターの「フリーウェイドライブ」モードを使用してテストしたとき、少なくともそれが周波数であることを教えました。代わりに "city run"でテストしたところ、位置の戻り頻度は時間間隔に依存せず、距離に依存していることがわかります...関数は、100メートルごとに一度、位置を返します。ポジションがそれほど変わるのにどれくらいの時間がかかったか。
なぜこんな感じ?これは予想される動作ですか? iOSエミュレーターとコードのどちらが関係しているのかはわかりませんが、位置をもっと正確に知りたいので、できるだけ頻繁に返すようにしたいと思います。
componentDidMount() {
const { region } = this.state;
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({position});
},
(error) => alert(JSON.stringify(error)),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
);
this.watchID = navigator.geolocation.watchPosition((lastPosition) => {
var { distanceTotal, record } = this.state;
this.setState({lastPosition});
if(record) {
var newLatLng = {latitude:lastPosition.coords.latitude, longitude: lastPosition.coords.longitude};
this.setState({ track: this.state.track.concat([newLatLng]) });
this.setState({ distanceTotal: (distanceTotal + this.calcDistance(newLatLng)) });
this.setState({ prevLatLng: newLatLng });
}
},
(error) => alert(JSON.stringify(error)),
{enableHighAccuracy: true, timeout: 20000, maximumAge: 0});
}
メートル単位で精度を設定するdistanceFilter
というオプションを設定できます。 ジオロケーションのドキュメント に記載されていますが、その機能やデフォルト値については説明されていません。 github でソースコードを見ると、デフォルトは100メートルに設定されており、これが動作を説明しています。
1メートルの精度が必要な場合は、オプションを次のように設定します:{enableHighAccuracy: true, timeout: 20000, maximumAge: 0, distanceFilter: 1}