为什么我的PhoneGap定位功能会多次返回该位置?

时间:2017-09-20 19:38:06

标签: cordova geolocation phonegap

我有这个功能,可以获得更高精度的GPS结果:

navigator.geolocation.getAccurateCurrentPosition = function (geolocationSuccess, geolocationError, geoprogress, options) {
    var lastCheckedPosition,
        locationEventCount = 0,
        watchID,
        timerID;

    options = options || {};

    var checkLocation = function (position) {
        lastCheckedPosition = position;
        locationEventCount = locationEventCount + 1;
        // We ignore the first event unless it's the only one received because some devices seem to send a cached
        // location even when maxaimumAge is set to zero
        if ((position.coords.accuracy <= options.desiredAccuracy) && (locationEventCount > 1)) {
            clearTimeout(timerID);
            navigator.geolocation.clearWatch(watchID);
            foundPosition(position);
        } else {
            geoprogress(position);
        }
    };

    var stopTrying = function () {
        navigator.geolocation.clearWatch(watchID);
        foundPosition(lastCheckedPosition);
    };

    var onError = function (error) {
        clearTimeout(timerID);
        navigator.geolocation.clearWatch(watchID);
        geolocationError(error);
    };

    var foundPosition = function (position) {
        geolocationSuccess(position);
    };

    if (!options.maxWait)            options.maxWait = 10000; // Default 10 seconds
    if (!options.desiredAccuracy)    options.desiredAccuracy = 20; // Default 20 meters
    if (!options.timeout)            options.timeout = options.maxWait; // Default to maxWait

    options.maximumAge = 0; // Force current locations only
    options.enableHighAccuracy = true; // Force high accuracy (otherwise, why are you using this function?)

    watchID = navigator.geolocation.watchPosition(checkLocation, onError, options);
    timerID = setTimeout(stopTrying, options.maxWait); // Set a timeout that will abandon the location loop
};

然后我打电话给:

navigator.geolocation.getAccurateCurrentPosition(onSuccess, onError, onProgress, {desiredAccuracy:20, maxWait:15000});

当它找到一个位置时,它将触发geolocationSuccess(position);(上述函数的成功。问题是在我的PhoneGap应用程序中,它似乎经常多次调用它。有时在4-5次内同样的第二个。

为什么会这样?我只是初始化它一次,它不在任何循环中。

1 个答案:

答案 0 :(得分:1)

该剧本的作者在github readme上回答了您的问题(重点是我的):

  

更好的方法是使用navigator.geolocation.watchPosition()。每次位置更改或每次设备提高准确度时(根据我的观察结果),此方法都会进行回调。在我自己使用新启动的设备进行测试时,需要2到6次回调才能获得高度准确的信息。这使我编写了这个非常简单的JavaScript函数,它将watchPosition()与一个简单的计时器结合使用。

因此作者在此实现中使用了geolocation watchPosition()方法。 如果位置或精度发生变化,watchPosition()方法的回调可能会多次被调用。见documentation(重点是我的):

  

如果位置数据发生变化(通过设备移动或更多)   准确的地理信息到达),您可以设置回调函数   用更新的位置信息调用。这个完成了   使用watchPosition()函数,它具有相同的输入   参数为getCurrentPosition()。 调用回调函数   多次,允许浏览器更新您的位置   你移动,或提供更准确的位置作为不同的技术   用于地理定位你。错误回调函数,即   可以调用getCurrentPosition()的可选项   反复。