2014-05-16 21 views
7

Tworzę aplikację Android za pomocą html 5 i chcę uzyskać dostęp latlong od użytkownika, jak porusza się użytkownik. Użyłem watchPostion, ale jednoznacznie podaję lokalizację użytkownika.HTML5 geolokalizacja watchPosition nazywanie tylko raz

var watchID; 
var geoLoc; 

function showLocation(position) { 
    var latitude = position.coords.latitude; 
    var longitude = position.coords.longitude; 

    var ll=new google.maps.LatLng(latitude, longitude); 
    map.setCenter(ll); 

    console.log("Latitude : " + latitude + " Longitude: " + longitude); 
} 

function errorHandler(err) { 
    if(err.code == 1) { 
    console.log("Error: Access is denied!"); 
    }else if(err.code == 2) { 
    console.log("Error: Position is unavailable!"); 
    } 
    } 
    if(navigator.geolocation){ 
     // timeout at 60000 milliseconds (60 seconds) 
     var options = {timeout:60000}; 
     geoLoc = navigator.geolocation; 
     watchID = geoLoc.watchPosition(showLocation, 
            errorHandler, 
            options); 


    }else{ 
     console.log("Sorry, browser does not support geolocation!"); 
    } 

Odpowiedz

6

Pracuję nad czymś podobnym kilka miesięcy temu. Pamiętam, że miałem ten sam problem. Może to pomoże.

$(document).ready(function(){ 
    initLocationProcedure(); 
} 

function initLocationProcedure() { 
    map = new google.maps.Map(document.getElementById('map_canvas'), { 
      zoom : 17 
    }); 

    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(displayAndWatch, locError, { 
      enableHighAccuracy : true, 
      timeout : 60000, 
      maximumAge : 0 
     }); 
    } else { 
     alert("Your phone does not support the Geolocation API"); 
    } 
} 

function displayAndWatch(position) { 
    // set current position 
    setUserLocation(position); 
    // watch position 
    watchCurrentPosition(); 
} 

function setUserLocation(pos) { 
    // marker for userLocation 
    userLocation = new google.maps.Marker({ 
      map : map, 
      position : new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude), 
      title : "You are here", 
      icon : "../img/user-location.svg", 
    // scroll to userLocation 
    map.panTo(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude)); 
}); 

Oto co szukasz

function watchCurrentPosition() { 
    var positionTimer = navigator.geolocation.watchPosition(function(position) { 
     setMarkerPosition(userLocation, position); 
     map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 
    }); 
} 

function setMarkerPosition(marker, position) { 
    marker.setPosition(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 
    console.log(position); 
} 

Fiddle
http://jsfiddle.net/XEFks/

+0

Witam Barto, próbowałem używać twojego kodu, ale wciąż mam ten sam problem. Próbowałem kodu w przeglądarce mobilnej i działa dobrze, ale w przeglądarkach komputerowych otrzymuję lokalizację tylko raz. –

+0

Umieściłem go w skrzypcach http://jsfiddle.net/XEFks/, jeśli otworzysz stronę i spojrzysz na konsolę, powinieneś zobaczyć aktualizację lokalizacji (w konsoli pojawi się obiekt Gelocation). Nie będzie aktualizowany co sekundę, ponieważ początkowo lokalizacja jest ustawiona, gdy zostanie znaleziona lepsza, pierwsza jest aktualizowana i tak dalej. (Zdecydowanie działa tutaj) – boortmans

+0

ok.Masz na myśli to, że jeśli pozycja nie jest aktualizowana, nie byłbym w stanie uzyskać pozycji, dopóki pozycja się nie zmieni. Krótko mówiąc, nie można uzyskać lokalizacji wielokrotnie na pulpicie, ponieważ nie zmienia ona swojej lokalizacji? –

3

Trzeba zapewnić metodę Geolocation.clearWatch() z identyfikatorem zadzwonić, jak również tak, że resetuje lokalizację.

patrz przykład poniżej:

Web/API/Geolocation.watchPosition

Sposób Geolocation.watchPosition() jest wykorzystywany do rejestracji funkcji obsługi, która za każdym razem będą nazywane automatycznie zmieni swoje położenie urządzenia. Opcjonalnie można również określić funkcję zwrotną obsługi błędów.

Ta metoda zwraca wartość identyfikatora zegarka, której można użyć do wyrejestrowania programu obsługi, przekazując go do metody Geolocation.clearWatch().

Składnia

var id, target, option; 

function success(pos) { 
    var crd = pos.coords; 

    if (target.latitude === crd.latitude && target.longitude === crd.longitude) { 
    console.log('Congratulation, you reach the target'); 
    navigator.geolocation.clearWatch(id); 
    } 
}; 

function error(err) { 
    console.warn('ERROR(' + err.code + '): ' + err.message); 
}; 

target = { 
    latitude : 0, 
    longitude: 0, 
} 

options = { 
    enableHighAccuracy: false, 
    timeout: 5000, 
    maximumAge: 0 
}; 

id = navigator.geolocation.watchPosition(success, error, options); 

Można również spróbować owijania wyraźną funkcję jak poniżej. Ustawienie wartości null spowoduje również zaktualizowanie.

// clear the watch that was started earlier 
// 
function clearWatch() { 
    if (watchID != null) { 
     navigator.geolocation.clearWatch(watchID); 
     watchID = null; 
    } 
} 
+0

Nadal nie działa. Użyłem ClearWatch, ale nie rozumiem, dlaczego mój kod nie działa. –

+0

czy użyłeś Clearwatch (watchID); lubię to. przekazanie w oryginalnym id? – SoftwareCarpenter

+0

Tak. Użyłem w ten sposób. –

0
function watchCurrentPosition() { 
    var positionTimer = navigator.geolocation.watchPosition(function(position) { 
     setMarkerPosition(userLocation, position); 
     map.panTo(new google.maps.LatLng(position.coords.latitude, position.coords.longitude)); 
    }); 
} 

To na pewno pomoże ..