2009-12-22 13 views
22

Devo determinare la posizione di una persona entro 50 m. Mi chiedo se dovrei usare navigator.location.watchPostion() o chiamare getCurrentPostion() più e più volte. watchPostion() è la corretta API W3C per fare ciò che voglio, ma in pratica sembra essere eccessivo.watchPosition() vs getCurrentPosition() con setTimeout

Ecco il mio codice:

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();}); 

ho notato watchPostion() sembra risultare in ultima analisi, a una maggiore precisione (dopo un po '), ma mi chiedo se la posizione cambia così velocemente che si traduce in un sacco di cosa viene scaricata sulla tela della mia mappa, con richieste http costanti che sono presto superate, sostituite da quelle nuove in arrivo. Quando uso watchPosition(), ci vuole un po 'prima che la pagina venga caricata.

+0

Esiste un modo per pubblicare un esempio del codice HTML + Javascript completo della soluzione? Comprese le chiamate listener e enableContinuousZoom()? Non ho familiarità con GMap2 e quindi devo decodificare ... Ma potrebbe salvare qualcun altro nei miei panni un giorno di lavoro ... – ftrotter

+0

Controlla il commento dove ho risposto a Sam qui sotto. – devlord

+0

Guardando la documentazione sembra che ci sia qualcosa che manca tra gli estremi di GetCurrentPosition (che esegue il gestore di successo ASAP) e WatchPosition (che è progettato per essere eseguito tutto il tempo che l'utente è sulla pagina). Mi sarebbe piaciuta l'opzione "soglia di accuratezza" nella chiamata a GetCurrentPosition, che attende questa precisione o il timeout. A meno che nessun altro lo abbia già creato utilizzando WatchPosition, credo che lo farò ora. –

risposta

17

Dopo alcuni seri test, ho verificato che watchPosition() fornirà una posizione precisa molto più rapidamente di getCurrentPostion() più e più volte. Quando si utilizza watchPostion(), la mappa si comporta male se la si ridisegna più e più volte ogni volta che il dispositivo aggiorna la posizione. Per aggirare questo problema, ho aggiunto un ascoltatore all'evento tilesloaded, che mi consente di ridisegnare la mappa solo se non c'è già un thread che cerchi di disegnare sulla mappa. Una volta che l'utente è soddisfatto della posizione determinata, cancellerò l'orologio. Questo mi darà il meglio di entrambi i mondi, per quanto riguarda il consumo e l'accuratezza della batteria.

12

Ogni volta che si chiama getCurrentLocation, il gps viene attivato e richiede alcuni istanti. Se si chiama watchPosition e si attende fino a quando si ottiene una certa precisione, quindi rimuovere l'orologio si otterranno risultati migliori, senza il sovraccarico di un orologio costante.