html5-geolocation: navigator.geolocation.watchPosition непрерывные обратные вызовы - PullRequest
0 голосов
/ 16 июня 2011

Я использую API геолокации HTML5.Недавно я решил перейти от опроса пользовательской позиции к использованию метода watchPosition, который должен запускать свою функцию «success» после изменения положения устройства.

Но вместо этого он наполняет мою базу данных одной и той же позицией снова и снова.Соответствующий код выложен ниже:

updateLocation = navigator.geolocation.watchPosition(success, failed, {enableHighAccuracy:true, maximumAge:30000, timeout:27000});

function success(){
showGPS(position);
}

function showGPS(position) {
    var lng = position.coords.longitude;
    var lat = position.coords.latitude;
    gpsText.innerText = "Latitude: "+ lat +"\nLongitude: "+ lng + "\nAccuracy: "+    position.coords.accuracy + "\nSpeed:" + (position.coords.speed*3.6) + "\nAltitude:" + position.coords.altitude;
    getData("http://databaseEntryURL/gpsReceiver.aspx?string=" + gpsText.innerText);
}

getData вызывается примерно 5 раз в секунду.Я уверен, что значение не меняется.Я использую Android 2.2, чтобы загрузить эту страницу.Как сделать так, чтобы функция успеха вызывалась ТОЛЬКО в случае изменения положения устройства?

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Возможно, это просто вызвано некоторой ошибкой, поэтому, даже если местоположение не изменилось (или изменение настолько мало), ваш обратный вызов все еще срабатывает.

Один из способов решить это - сохранить последнее местоположение ииспользуя его для сравнения с текущим местоположением.Если нет изменений (или изменение слишком мало), ничего не делать в обратном вызове.Это сэкономит вам пропускную способность и пространство базы данных.

Если вам необходимо сэкономить заряд аккумулятора телефона, вам нужно оптимизировать параметры, например, изменив enableHighAccuracy на false.

0 голосов
/ 25 января 2013

Более эффективным способом было бы установить watchPosition в качестве переменной и вызвать clearWatch() для нее, как только вы получите первый ответ:

var watchID = navigator.geolocation.watchPosition(onSuccess, onFailed);
function onSuccess(position) {
    navigator.geolocation.clearWatch(watchID);
};
...