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