google - navigator geolocation getcurrentposition javascript
watchPosition() vs getCurrentPosition() con setTimeout (2)
Necesito determinar la ubicación de una persona dentro de 50m. Me pregunto si debo usar navigator.location.watchPostion()
o llamar a getCurrentPostion()
una y otra vez. watchPostion()
es la API adecuada de W3C para hacer lo que quiero, pero en la práctica, parece ser una exageración.
Aquí está mi código:
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();});
Me he dado cuenta de que watchPostion()
finalmente resulta en una mayor precisión (después de un tiempo), pero me pregunto si la posición cambia tan rápido que resulta en muchas cosas que se descargan en el lienzo de mi mapa, con solicitudes http constantes que pronto estarán desactualizados, reemplazados por los nuevos que watchPosition()
. Cuando uso watchPosition()
, toma un tiempo antes de que se cargue la página.
Cada vez que llamas a getCurrentLocation, el gps se gira, lo que lleva unos minutos. Si llama a watchPosition y espera hasta obtener una cierta precisión, luego retire su reloj y obtendrá mejores resultados, sin la sobrecarga de un reloj constante.
Después de algunas pruebas serias, he verificado que watchPosition () le dará una ubicación precisa mucho más rápidamente que getCurrentPostion () una y otra vez. Cuando usa watchPostion (), el mapa se comporta mal si lo redibuja una y otra vez cada vez que el dispositivo actualiza su ubicación. Para solucionar esto, agregué un detector al evento de carga de mosaicos, que me permite volver a dibujar el mapa solo si aún no hay un hilo que intenta dibujar en el mapa. Una vez que el usuario esté satisfecho con la ubicación determinada, limpiaré el reloj. Esto me dará lo mejor de ambos mundos, en lo que respecta al consumo y la precisión de la batería.