2017-01-01 1 views
6

Ich verwende navigator.geolocation.watchPosition in meinem nativen Projekt, um einen Pfad auf einer Karte zu zeichnen, während sich der Benutzer bewegt. Ich habe bemerkt, dass die Rücksprungfrequenz für diese Funktion ziemlich niedrig ist. Ich habe gelehrt, dass es zumindest die Häufigkeit war, als ich mit dem iOS-Emulator und dem "Freeway Drive" -Modus im gps-Emulator getestet habe. Wenn ich nun mit "city run" teste, kann ich sehen, dass die Rückkehrfrequenz der Position nicht von einem bestimmten Zeitintervall abhängt, sondern von einer Entfernung ... Die Funktion gibt ihre Position einmal alle 100 Meter zurück, egal Wie lange hat es gedauert, bis sich die Position so verändert hat?navigator.geolocation.watchPosition gibt nur alle 100 m zurück

Warum ist es so? Ist das ein erwartetes Verhalten? Ich weiß nicht, ob es mit dem iOS-Emulator oder mit meinem Code zu tun hat, aber ich würde wirklich gerne die Position präzisieren, ich möchte, dass sie so oft wie möglich zurückkehrt.

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

ich genau das gleiche Problem habe. Haben Sie eine Lösung für dieses Problem gefunden? Vielen Dank. – Larney

Antwort

15

Es gibt eine Option, die Sie, dass festlegen wird distanceFilter genannt, die Sie die Genauigkeit in Metern eingestellt. Es ist in der documentation for geolocation angegeben, aber nicht erklärt, was es tut oder den Standardwert. Wenn Sie sich den Quellcode unter github ansehen, ist der Standardwert auf Meter eingestellt, was Ihr Verhalten erklärt.

Wenn Sie 1 Meter Genauigkeit wollen setzen Sie die Optionen wie: {enableHighAccuracy: true, timeout: 20000, maximumAge: 0, distanceFilter: 1}

Verwandte Themen