2009-12-22 15 views
22

Muszę określić lokalizację osoby w promieniu 50m. Zastanawiam się, czy powinienem używać navigator.location.watchPostion() lub dzwonić getCurrentPostion() w kółko. watchPostion() jest właściwym API W3C do robienia tego, co chcę, ale praktycznie wydaje się, że to przesada.watchPosition() vs getCurrentPosition() z setTimeout

Oto mój kod:

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

Zauważyłem watchPostion() wydaje się ostatecznie skutkować większą dokładnością (po jakimś czasie), ale zastanawiam się, czy pozycja zmienia się tak szybko, że wynika to w wielu rzeczy, które są pobierane do mojego płótna mapy, ze stałymi żądaniami http, które są wkrótce przestarzałe, zastąpione nowymi. Kiedy używam watchPosition(), ładowanie strony zajmuje trochę czasu.

+0

Czy jest jakiś sposób, aby opublikować przykład pełnego kodu HTML + JavaScript rozwiązania? W tym wywołania funkcji Listener i enableContinuousZoom()? Nie jestem obeznany z GMap2 i dlatego muszę wykonać inżynierię wsteczną ... Ale może pewnego dnia uratuje się ktoś w moich butach ... – ftrotter

+0

Sprawdź komentarz, w którym odpowiedziałem Samowi poniżej. – devlord

+0

Patrząc na dokumentację, wydaje się, że czegoś brakuje między skrajnościami GetCurrentPosition (która uruchamia program ASAP) i WatchPosition (który ma działać przez cały czas, gdy użytkownik jest na stronie). Wolałbym opcję "progu dokładności" w wywołaniu GetCurrentPosition - która czeka na taką dokładność lub limit czasu. O ile nikt inny nie stworzył tego przy użyciu WatchPosition, chyba zrobię to teraz. –

Odpowiedz

17

Po kilku poważnych testach sprawdziłem, że watchPosition() da ci dokładną lokalizację znacznie szybciej niż getCurrentPostion() w kółko. Podczas korzystania z funkcji watchPostion() mapa zachowuje się kiepsko, jeśli zmienia się ją w kółko za każdym razem, gdy urządzenie aktualizuje swoją lokalizację. Aby obejść ten problem, dodałem słuchacza do zdarzenia tileloaded, co pozwala mi przerysować mapę, jeśli nie ma już wątku próbującego narysować mapę. Gdy użytkownik będzie zadowolony z określonej lokalizacji, wyczyści zegarek. To zapewni mi to, co najlepsze z obu światów, jeśli chodzi o zużycie baterii i dokładność.

12

Za każdym razem, gdy wywołuje się getCurrentLocation, następuje odwirowanie GPS, co zajmuje kilka chwil. Jeśli zadzwonisz do watchPosition i poczekasz, aż uzyskasz pewną dokładność, a potem usuniesz zegarek, uzyskasz lepsze wyniki, bez konieczności ciągłego nadzoru.