2017-01-01 11 views
6

私が反応しているネイティブプロジェクトでnavigator.geolocation.watchPositionを使用して、移動中に地図上にパスをペイントしています。私は戻り周波数がこの機能のためにかなり低いことに気づいた。私は、iOSエミュレータとgpsエミュレータの「フリーウェイドライブ」モードを使用してテストしたとき、少なくとも周波数だと教えてくれました。今度は "市街地走行"でテストしたところ、位置の戻り頻度はある時間間隔に依存するのではなく、距離に依存していることがわかりました。関数は100メートルごとに1回ずつ位置を返していますポジションがそれほど変わるのにどれくらいの時間がかかりましたか?navigator.geolocation.watchPositionはそれぞれ100mを返す

なぜこのようなのですか?これは期待される行動ですか?私はそれが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}); 
} 
+1

。あなたはこの問題の解決策を見つけましたか?ありがとう。 – Larney

答えて

15

あなたはそれがあなたがメーターの精度を設定distanceFilterと呼ばれている設定できるオプションがあります。 documentation for geolocationに記載されていますが、その機能やデフォルト値は説明されていません。 githubでソースコードを見ると、デフォルトはメートルに設定されており、これはあなたの動作を説明しています。

あなたは1メートルの精度が必要な場合は、あなたのようにオプションを設定します。私は正確に同じ問題を抱えてい {enableHighAccuracy: true, timeout: 20000, maximumAge: 0, distanceFilter: 1}

関連する問題