Internet Explorer 9 – Geolokacja  

Udostępnij na: Facebook

Autor: Marcin Borecki

Opublikowano: 2010-06-07

Wprowadzenie

Już nie wystarczy, by serwisy internetowe dostosowywały się do naszych preferencji, chcemy również, aby prezentowały treści zgodne z miejscem, gdzie aktualnie przebywamy. Dotychczas, aby uzyskać informacje o miejscu, gdzie znajduje się użytkownik, aplikacje musiały wykorzystywać np. adres IP, nadajniki radiowe sieci komórkowej, sieci WiFi lub urządzenia GPS.

Wraz z pojawieniem się specyfikacji Geolocation API dla przeglądarek internetowych zagadnienie stało się bardziej powszechne i zunifikowane. Najnowsze przeglądarki internetowe, w tym Internet Explorer 9, implementują mechanizm, który w prosty sposób może udostępnić witrynom m.in. wysokość i szerokość geograficzną miejsca, gdzie znajduje się czytelnik.

W tym artykule zostanie przedstawiony mechanizm pozyskiwania danych o położeniu i obsłudze błędów wraz z przykładem prezentującym położenie na mapie BING.

Prywatność

Strona internetowa nie uzyska informacji o naszej lokalizacji, jeżeli nie wyrazimy na to zgody. Podczas pierwszej próby odczytania pozycji przeglądarka Internet Explorer zapyta nas, czy jesteśmy zainteresowani przekazaniem tego typy danych stronie internetowej.

Podstawy

Poniżej przedstawiam najprostsze rozwiązanie pozwalające na uzyskanie koordynatów wskazujących na pozycję użytkownika:

functionpobierz_lokalizacje() {
  navigator.geolocation.getCurrentPosition(przetwarzaj_lokalizacje);
}

Funkcja uruchamia metodę getCurrentPosition, która zaraz po odczytaniu lokalizacji przekaże sterowanie do funkcji przetwarzaj_lokalizacje. Przykładowy kod przedstawiam poniżej:

functionprzetwarzaj_lokalizacje(position) {
varlatitude = position.coords.latitude;
varlongitude = position.coords.longitude;
var accuracy = position.coords.accuracy;

  alert(
                'dokładność pomiaru '
                +  accuracy
                + ' współrzędne: ' +  latitude + ' - ' + longitude
             ); 
}

Pozostałe właściwości, jakie mogły być wykorzystane w powyższym przykładzie przy użyciu obiektu position:

Właściwość Typ Dodatkowe informacje
latitude* Double Podawane w stopniach.
longitude* Double Podawane w stopniach.
altitude Double lub null Podawane w metrach.
Accuracy* Double Podawane w metrach.
altitudeAccuracy Double lub null Podawane w metrach.
heading Double lub null W stopniach według wskazówek zegara liczone od północy.
speed Double lub null Podawane w metrach/sekundę

* tylko te właściwości są zawsze wypełniane przez przeglądarkę internetową, pozostałe są opcjonalne.

Obsługa błędów

Pobieranie lokalizacji jest skomplikowanym procesem, podczas którego może wystąpić wiele problemów. Poniżej znajduje się funkcja, która może zareagować na typowe problemy:

function onError(geoPositionError) {

        switch (geoPositionError.code) {
            case 0: // UNKNOWN_ERROR
                alert('Nieznany błąd');
                break;
            case 1: // PERMISSION_DENIED
                alert('Brak zgody na pobranie lokalizacji.');
                break;
            case 2: // POSITION_UNAVAILABLE
                alert('Nie można ustalić lokalizacji.');
                break;
            case 3: // TIMEOUT
                alert('Przekroczono czas oczekiwania na ustalenie lokalizacji.');
                break;
            default:
        }
    }

Funkcję podpinamy do wywołania getCurrentPosition w następujący sposób:

navigator.geolocation.getCurrentPosition(przetwarzaj_lokalizacje, onError);

Dokładność

Podczas wywołania metody odpowiedzialnej za ustalenie pozycji użytkownika serwisu możemy też wybrać, z jaką dokładnością ma się odbyć pomiar. Parametr ma znaczenie wtedy, gdy urządzenie, na którym zainstalowana jest przeglądarka internetowa, wspiera więcej niż jeden sposób ustalania pozycji, np. telefon, który może ustalić lokalizację na podstawie GPS (dokładny pomiar) oraz na podstawie sieci bazowych operatora (mało dokładny pomiar).

Opcja, jaką wybierzemy, nie tylko odzwierciedla dokładność odczytu, ale również wpływa na zużycie prądu oraz czas potrzebny do ustalenia położenia.

Właściwość Wartość domyślna Dodatkowe informacje
enableHighAccuracy false True angażuje wszelkie dostępne sprzętowo i programowo mechanizmy do ustalenia pozycji, jest wolne.
timeout Brak domyślnej wartości Podawany w milisekundach. Czas, po jakim mechanizm zwróci błąd z powodu braku wyników z pomiarem lokalizacji.
maximumAge 0 Podawany w milisekundach. Możemy określić, jak długo poprzednio odczytane dane będą aktualne dla naszego skryptu. Jeżeli nadamy parametrowi wartość odpowiadającą 1 minucie, to nastąpi tylko jeden odczyt, reszta żądań dostanie powielony wynik.

Zastosowanie opcji w kodzie wygląda następująco:

navigator.geolocation.getCurrentPosition(
przetwarzaj_lokalizacje, onError, { enableHighAccuracy: true});

Prezentacja na mapie

Poniżej zaprezentuję kod strony internetowej, która zaprezentuje na mapie Bing pozycję użytkownika.

Kod zawiera komentarze, które powinny wyjaśnić wszelkie zawiłości rozwiązania:

<!DOCTYPEHTMLPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">

<head>
<title></title>
<metahttp-equiv="Content-Type" content="text/html; charset=utf-8" />
<scripttype="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script>
<scripttype="text/javascript">
var map = null;
    function GetLocalization() {
        map = new Microsoft.Maps.Map(document.getElementById("mapDiv"),
{ credentials: "KLUCZ_PROGRAMISTYCZNY_DO_BING",
              zoom: 14
            });

// sprawdzamy czy przeglądarka obsługuje mechanizm
if (navigator.geolocation) {
// Pobieranielokalizacji
navigator.geolocation.getCurrentPosition(onSuccess, onError, { maximumAge: 0, timeout: 30000, enableHighAccuracy: true });
}
else {
window.status = "Lokalizacja nie jest wspierana przez przeglądarkęinternetową.";
        }
    }

functiononSuccess(loc) {

// ustawienie widoku mapy
var lokalizacja = newMicrosoft.Maps.Location(loc.coords.latitude, loc.coords.longitude);
map.setView({ center: lokalizacja });

// ustawienie pinezki
var pinezka = newMicrosoft.Maps.Pushpin(lokalizacja);
map.entities.push(pinezka);

        alert(
'dokładność pomiaru '
                + loc.coords.accuracy
+ ' współrzędne: ' + loc.coords.latitude + ' - ' + loc.coords.longitude
             ); 
    }

    function onError(geoPositionError) {

        switch (geoPositionError.code) {
            case 0: // UNKNOWN_ERROR
                alert('Nieznany błąd');
break;
case 1: // PERMISSION_DENIED
                alert('Użytkownik nie wyraził zgody na udostępnienie lokalizacji');
break;
            case 2: // POSITION_UNAVAILABLE
                alert('Niemożnaustalićlokalizacji.');
                break;
            case 3: // TIMEOUT
alert('Przekroczono czas oczekiwania na ustalenie lokalizacji.');
break;
            default:
        }
    }
</script>
</head>

<bodyonload="GetLocalization();">
<divid='mapDiv' style="position: relative; width: 640px; height: 480px;"></div>
</body>

</html>

Efekt działania:

Podsumowanie

W artykule omówiono specyfikację W3C Geolocation API, która została zaimplementowana między innymi w najnowszej przeglądarce Microsoftu – Internet Explorer 9. Przedstawiono również najważniejsze elementy wraz z przykładem pokazującym na mapie lokalizację wraz z informacją o możliwym błędzie pomiaru.

W tym krótkim omówieniu specyfikacji trudno o bardziej szczegółowy opis wszystkich aspektów Geolocation API, dlatego zachęcam do zapoznania się z specyfikacją na oficjalnej stronie projektu link.