web-dev-qa-db-ja.com

navigator.geolocation.watchPositionは各100 mのみを返す

ユーザーの移動中にマップ上のパスをペイントするために、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});
} 
14
theva

メートル単位で精度を設定するdistanceFilterというオプションを設定できます。 ジオロケーションのドキュメント に記載されていますが、その機能やデフォルト値については説明されていません。 github でソースコードを見ると、デフォルトは100メートルに設定されており、これが動作を説明しています。

1メートルの精度が必要な場合は、オプションを次のように設定します:{enableHighAccuracy: true, timeout: 20000, maximumAge: 0, distanceFilter: 1}

31
Kimmen