Я обнаружил, что телефонам (по крайней мере, с iPhone) обычно требуется три проверки для получения точного показания, почти как если бы они триангулировали положение. Проблема, как вы обнаружили, заключается в том, что каждый новый вызов getCurrentPosition()
кажется «слепым», поэтому он не становится более точным (результаты меняются, когда вы запускаете эту функцию на настольном компьютере / ноутбуке).
Решение geolocation.watchPosition()
. Эта функция использует предыдущие вызовы для повышения точности. Примерно через пять секунд он будет настолько точным, насколько это возможно (если вы не двигаетесь), поэтому вы прекращаете проверку. Кроме того, он перестанет проверять всякий раз, когда думает, что не станет более точным. Используйте window.setTimeout()
для управления интервалом.
Демо: http://jsfiddle.net/ThinkingStiff/yn3Bq/
HTML:
<div id="result"></div>
Сценарий:
var latitude, longitude, accuracy;
function setGeolocation() {
var geolocation = window.navigator.geolocation.watchPosition(
function ( position ) {
latitude = position.coords.latitude;
longitude = position.coords.longitude;
accuracy = position.coords.accuracy;
document.getElementById( 'result' ).innerHTML +=
'lat: ' + latitude + ', '
+ 'lng: ' + longitude + ', '
+ 'accuracy: ' + accuracy + '<br />';
}, function () {
/*error*/
}, {
maximumAge: 250,
enableHighAccuracy: true
}
);
window.setTimeout( function () {
window.navigator.geolocation.clearWatch( geolocation )
},
5000 //stop checking after 5 seconds
);
};
setGeolocation();
window.setTimeout( function () {
setGeolocation();
},
30000 //check every 30 seconds
);
Выход:
широта: 35,5830119, язык: -124,4871223, точность: 40
широта: 35.5829974, lng: -124.4871525, точность: 30