Geolokalizacja i Google Maps, cz. 2 – obiekt geolocation

W drugiej części cyklu o geolokalizacji i Google Maps omówię bardziej szczegółowo obiekt geolocation.

Najłatwiej będzie zrozumieć mechanikę geolokalizacji analizując kod, a więc bez zbędnej teorii przejdźmy do kodu (istotne kwestie opisuję w komentarzach) :)

Pobranie położenia statycznego użytkownika

function getLocation() {
    var options = {
        enableHighAccuracy: true, // przy aktywnej opcji lokalizacja zostanie pobrana najbardziej dokladna metoda z dostepnych dla danego urzadzenia
        timeout: 20000, // maksymalny czas (w milisekundach) polaczenia
        maximumAge: 0 // czas (w milisekundach) cache'owania (zapamietywania) pozycji uzytkownika
    };
    if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(success, error, options);
    }
    else {
        console.log("Geolocation is not supported by this browser.");
    }
}
/**
 * Metoda wywolywana w przypadku pomyslnie pobranej pozycji
 */
function success(pos) {
    var crd = pos.coords;

    console.log('Twoja aktualna pozycja:');
    console.log('Szerokosc geograficzna : ' + crd.latitude);
    console.log('Wsyokosc geograficzna: ' + crd.longitude);
    console.log('Dokladnosc: ' + crd.accuracy + ' metrow');
    console.log('Wysokosc nad poziomem morza: ' + crd.altitude + ' metrow');
    console.log('Dokladnosc pomiaru wysokosci nad poziomem morza: ' + crd.altitudeAccuracy + ' metrow');
    console.log('pozycja w stopniachw prawo od polnocy: ' + crd.heading); // Nie wiem jak to prosto wyjasnic, wiecej informacji: http://en.wikipedia.org/wiki/Course_%28navigation%29
    console.log('Predkosc w metrach na sekunde: ' + crd.speed);
    console.log('Czas otrzymania odpowiedzi: ' + pos.timestamp);
}
/**
 * Metoda wywolywana w przypadku problemow z pobraniem pozycji
 */
function error(error) {
    var message;
      switch (error.code) {
            case error.PERMISSION_DENIED:
                  message = "User denied the request for Geolocation."
                  break;
            case error.POSITION_UNAVAILABLE:
                  message = "Location information is unavailable."
                  break;
            case error.TIMEOUT:
                  message = "The request to get user location timed out."
                  break;
            case error.UNKNOWN_ERROR:
                  message = "An unknown error occurred."
                  break;
        }
    console.log(message);
} 

Najważniejszym fragmentem kodu jest wywołanie metody getCurrentPosition(), to ona odpowiedzialna jest za określenie lokalizacji urządzenia. W przypadku udanej próby zostanie wywołana funkcja success(), w przeciwnym wypadku zostanie wykonana funkcja error(). Wewnątrz funkcji success() wyświetlam wszystkie dane, jakie mamy do dyspozycji.

Pobranie położenia w przypadku ruchu

Dodatkowo mamy możliwość śledzenia zmiany lokalizacji urządzenia. Do tego służy metoda watchPosition(). Sposób wykorzystania jej jest niemal identyczny jak w przypadku getCurrentPosition().

var id, target;
target = {
    latitude: 0,
    longitude: 0
};
function getLocation() {
    var options = {
        enableHighAccuracy: true, // przy aktywnej opcji lokalizacja zostanie pobrana najbardziej dokladna metoda z dostepnych dla danego urzadzenia
        timeout: 20000, // maksymalny czas (w milisekundach) polaczenia
        maximumAge: 0 // czas (w milisekundach) cache'owania (zapamietywania) pozycji uzytkownika
    };
      if (navigator.geolocation)
        {
            id = navigator.geolocation.id = navigator.geolocation.watchPosition(success, error, options);
        (success, error, options);
        }
      else {
        console.log("Geolocation is not supported by this browser.");
    }
}
/**
 * Metoda wywolywana w przypadku pomyslnie pobranej pozycji
 */
function success(pos) {
    var crd = pos.coords;
    console.log('Twoja aktualna pozycja:');
    console.log('Szerokosc geograficzna : ' + crd.latitude);
    console.log('Wsyokosc geograficzna: ' + crd.longitude);
    console.log('Dokladnosc: ' + crd.accuracy + ' metrow');
    console.log('Wysokosc nad poziomem morza: ' + crd.altitude + ' metrow');
    console.log('Dokladnosc pomiaru wysokosci nad poziomem morza: ' + crd.altitudeAccuracy + ' metrow');
    console.log('pozycja w stopniachw prawo od polnocy: ' + crd.heading); // Nie wiem jak to prosto wyjasnic, wiecej informacji: http://en.wikipedia.org/wiki/Course_%28navigation%29
    console.log('Predkosc w metrach na sekunde: ' + crd.speed);
    console.log('Czas otrzymania odpowiedzi: ' + pos.timestamp);
    
    if (target.latitude === crd.latitude && target.longitude === crd.longitude) {
        console.log('Dotarles do celu');
        navigator.geolocation.clearWatch(id);
    }
}
/**
 * Metoda wywolywana w przypadku problemow z pobraniem pozycji
 */
function error(error) {
    var message;
      switch (error.code) {
            case error.PERMISSION_DENIED:
                  message = "User denied the request for Geolocation."
                  break;
            case error.POSITION_UNAVAILABLE:
                  message = "Location information is unavailable."
                  break;
            case error.TIMEOUT:
                  message = "The request to get user location timed out."
                  break;
            case error.UNKNOWN_ERROR:
                  message = "An unknown error occurred."
                  break;
        }
    console.log(message);
} 
Print Friendly, PDF & Email