2009-12-22 16 views
22

Necesito determinar la ubicación de una persona dentro de los 50m. Me pregunto si debería usar navigator.location.watchPostion() o llamar al getCurrentPostion() una y otra vez. watchPostion() es la API correcta de W3C para hacer lo que quiero, pero prácticamente parece excesiva.watchPosition() vs getCurrentPosition() con setTimeout

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/[email protected]" + 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 watchPostion() parece ser el resultado en última instancia, con más exactitud (después de un tiempo), pero me pregunto si la posición cambia tan rápido que resulta en un montón de cosas que se descargan en mi lienzo de mapa, con solicitudes HTTP constantes que pronto están desactualizadas, reemplazadas por las nuevas que entran. Cuando uso watchPosition(), tarda un tiempo antes de que la página se cargue.

+0

¿Existe alguna manera de que pueda publicar un ejemplo del HTML completo + Javascript de su solución? ¿Incluyendo las llamadas oyente y enableContinuousZoom()? No estoy familiarizado con GMap2 y entonces tengo que hacer ingeniería inversa ... Pero podría salvar a alguien más en mis zapatos algún día ... – ftrotter

+0

Mira el comentario donde respondí a Sam a continuación. – devlord

+0

Al observar la documentación, parece que falta algo entre los extremos de GetCurrentPosition (que ejecuta el controlador de éxito ASAP) y WatchPosition (que está diseñado para ejecutarse todo el tiempo que el usuario está en la página). Me hubiera gustado una opción de 'umbral de precisión' en la llamada GetCurrentPosition, que espera esta precisión o el tiempo de espera. A menos que alguien más haya creado esto usando WatchPosition, supongo que lo haré ahora. –

Respuesta

17

Después de algunas pruebas serias, he verificado que watchPosition() te dará una ubicación exacta mucho más rápidamente que getCurrentPostion() una y otra vez. Al usar watchPostion(), el mapa se comporta mal si lo vuelve a dibujar una y otra vez cada vez que el dispositivo actualiza su ubicación. Para evitar esto, he agregado un oyente al evento tileloaded, que me permite redibujar el mapa solo si todavía no hay un hilo tratando de dibujar en el mapa. Una vez que el usuario esté satisfecho con la ubicación determinada, quitaré el reloj. Esto me dará lo mejor de ambos mundos, en lo que respecta al consumo de batería y precisión.

12

Cada vez que llame a getCurrentLocation, el gps se activa, lo que demora unos minutos. Si llama a watchPosition y espera hasta obtener cierta precisión, luego retire su reloj para obtener mejores resultados, sin la sobrecarga de un reloj constante.