2009-12-22 10 views
22

Ich muss den Standort einer Person innerhalb von 50m ermitteln. Ich frage mich, ob ich navigator.location.watchPostion() oder getCurrentPostion() immer wieder verwenden sollte. watchPostion() ist die richtige W3C API für das, was ich will, aber praktisch scheint es übertrieben zu sein.watchPosition() vs getCurrentPosition() mit setTimeout

Hier ist mein 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/[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();}); 

ich bemerkt habe watchPostion() in mehr Genauigkeit (nach einer Weile), um schließlich zur Folge haben scheint, aber ich frage mich, ob die Position so schnell ändert, dass es in vielen Ergebnisse der Sache, die auf meinen Kartenbereich heruntergeladen wird, mit konstanten http-Anforderungen, die bald veraltet sind, ersetzt durch die neuen, die hereinkommen. Wenn ich watchPosition() verwende, dauert es eine Weile, bevor die Seite geladen wird.

+0

Gibt es eine Möglichkeit, ein Beispiel für das vollständige HTML + Javascript Ihrer Lösung zu veröffentlichen? Einschließlich der Listener und aktivierenContinuousZoom() Anrufe? Ich bin mit GMap2 nicht vertraut, und deshalb muss ich Reverse Engineering ... Aber es könnte jemand anderes in meinen Schuhen einige Arbeit eines Tages retten ... – ftrotter

+0

Überprüfen Sie den Kommentar, wo ich auf Sam unten antwortete. – devlord

+0

Wenn man sich die Dokumentation anschaut, scheint zwischen den Extremen von GetCurrentPosition (die den Success-Handler ASAP ausführt) und WatchPosition (die für die gesamte Zeit, die der Benutzer auf der Seite läuft) etwas fehlt. Ich hätte gerne eine "Genauigkeitsschwelle" -Option für den GetCurrentPosition-Aufruf - der auf diese Genauigkeit oder auf das Timeout wartet. Es sei denn, jemand hat dies bereits mit WatchPosition erstellt, ich denke, ich mache das jetzt. –

Antwort

17

Nach einigen ernsthaften Tests habe ich überprüft, dass watchPosition() Ihnen eine genaue Position viel schneller gibt als getCurrentPostion() immer und immer wieder. Wenn Sie watchPostion() verwenden, verhält sich die Karte schlecht, wenn Sie sie jedes Mal neu zeichnen, wenn das Gerät Ihren Standort aktualisiert. Um dies zu umgehen, habe ich dem Ereignis tilesloaded einen Listener hinzugefügt, mit dem ich die Map nur dann neu zeichnen kann, wenn nicht bereits ein Thread versucht, auf der Map zu zeichnen. Sobald der Benutzer mit dem ermittelten Standort zufrieden ist, lösche ich die Uhr. Dies bringt mir das Beste aus beiden Welten, was Batterieverbrauch und Genauigkeit betrifft.

12

Jedes Mal, wenn Sie getCurrentLocation aufrufen, wird das GPS hochgefahren, was einige Minuten dauert. Wenn Sie watchPosition aufrufen und warten, bis Sie eine bestimmte Genauigkeit erhalten, dann entfernen Sie Ihre Uhr, Sie haben bessere Ergebnisse, ohne den Aufwand einer konstanten Überwachung.

Verwandte Themen