watchPosition() vs getCurrentPosition() avec setTimeout
je dois déterminer l'emplacement d'une personne à moins de 50 m. Je me demande si je devrais utiliser navigator.location.watchPostion()
ou appelez getCurrentPostion()
encore et encore. watchPostion()
est l'API W3C appropriée pour faire ce que je veux, mais en pratique, cela semble être exagéré.
Voici mon code:
var map = null;
var marker = null;
var layer = null;
function locFn(pos) {
var lat = pos.coords.latitude;
var lon = pos.coords.longitude;
$("#hlat").val(lat);
$("#hlong").val(lon);
document.getElementById("lnkMap").href =
"http://maps.google.com/maps?q=My+Loc@" + lat
+ "," + lon + "&z=18&t=h";
var point = new GLatLng(lat, lon);
if (pos.coords.accuracy < 100) {
map.setCenter(point, 18);
if (marker != null) {
marker.setLatLng(point);
}
else {
var ico = new GIcon();
ico.image = "img/Blue-Dot.png";
ico.iconSize = new GSize(22, 22);
ico.iconAnchor = new GPoint(11, 11);
marker = new GMarker(point, { icon: ico });
layer = map.addOverlay(marker, { title: "You are here." });
}
}
else if (pos.coords.accuracy > 2000) {
if (marker != null) { marker.setLatLng(point); }
map.setCenter(point, 15);
}
else if (pos.coords.accuracy > 900) {
if (marker != null) { marker.setLatLng(point); }
map.setCenter(point, 16);
}
else if (pos.coords.accuracy > 100) {
if (marker != null) { marker.setLatLng(point); }
map.setCenter(point, 17);
}
}
function locFail() {
//alert("Failed to retrieve location.");
}
var watchID = null;
function processPoints() {
map = new GMap2(document.getElementById("map_canvas"),
{ mapTypes: [G_HYBRID_MAP] });
try {
watchID = navigator.geolocation.watchPosition(locFn, locFail,
{ enableHighAccuracy: true });
}
catch(err) { /* desktop?*/ }
}
$(function(){processPoints();});
j'ai remarqué watchPostion()
semble finalement aboutir à plus de précision( après un certain temps), mais je me demande si la position change si vite qu'il en résulte beaucoup de choses étant téléchargées sur ma toile de carte, avec des requêtes http constantes qui sont bientôt périmées, remplacées par les nouvelles. Lorsque j'utilise watchPosition()
, il faut un certain temps avant que la page se charge.
2 réponses
après quelques tests sérieux, j'ai vérifié watchPosition() vous donnera une localisation précise beaucoup plus rapidement que getCurrentPostion() encore et encore. En utilisant watchPostion (), la carte se comporte mal si vous la redessinez encore et encore à chaque fois que l'appareil met à jour votre localisation. Pour contourner cela, j'ai ajouté un écouteur à l'événement tilesload, ce qui me permet de redessiner la carte seulement s'il n'y a pas déjà un thread essayant de dessiner sur la carte. Une fois que l'utilisateur est heureux avec l'emplacement déterminé, je vais libérer la montre. Cela me donnera le meilleur des deux mondes, en ce qui concerne la consommation de batterie et la précision.
Chaque fois que vous appelez getCurrentLocation le gps est lancé qui prend quelques instants. Si vous appelez watchPosition et attendre jusqu'à ce que vous obtenez une certaine précision, puis retirez votre montre, vous aurez de meilleurs résultats, sans la surcharge d'une surveillance constante.