web-dev-qa-db-fra.com

navigator.geolocation.watchPosition ne renvoie que tous les 100 m

J'utilise navigator.geolocation.watchPosition dans mon projet natif React pour peindre un chemin sur une carte pendant que l'utilisateur se déplace. J'ai remarqué que la fréquence de retour est assez faible pour cette fonction. J'ai appris que c'était la fréquence au moins, quand j'ai testé en utilisant l'émulateur iOS et le mode "lecteur autoroute" dans l'émulateur gps. Maintenant, quand j'ai testé avec "city run" à la place, je peux voir que la fréquence de retour de la position ne dépend pas d'un certain intervalle de temps, mais plutôt d'une distance ... La fonction retourne sa position une fois tous les 100 mètres, peu importe combien de temps il a fallu pour que le poste change autant.

Pourquoi est-ce comme ça? Est-ce un comportement attendu? Je ne sais pas si cela a à voir avec l'émulateur iOS ou avec mon code, mais j'aimerais vraiment que la position soit plus précise, je veux qu'elle revienne le plus souvent possible.

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

Vous pouvez définir une option appelée distanceFilter dont vous définissez la précision en mètres. Il est indiqué dans la documentation pour la géolocalisation mais pas expliqué ce qu'il fait ou la valeur par défaut. Si vous jetez un œil au code source à github la valeur par défaut est définie sur 100 mètres, ce qui explique votre comportement.

Si vous souhaitez une précision de 1 mètre, définissez les options comme suit: {enableHighAccuracy: true, timeout: 20000, maximumAge: 0, distanceFilter: 1}

31
Kimmen