Archiwum

Archive for Kwiecień 2011

Geolokacja w Internet Explorer 9– ciąg dalszy

Kwiecień 3, 2011 Dodaj komentarz

Już nie wystarczy by serwisy internetowe dostosowywały się do Naszych preferencji, chcemy by prezentowały treści zgodne z miejscem gdzie aktualnie przebywamy. Dotychczas aplikacje aby uzyskać informacje o położeniu użytkownika musiały wykorzystać np: adres IP, nadajniki radiowe sieci kompó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 między innymi wysokość i szerokość geograficzną czytelnika.

W tym artykule zostanie przedstawiony mechanizm pozyskiwania danych o położeniu, 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 się czytelnika czy jest zainteresowany przekazaniem tego typy danych stronie internetowej.

image

Podstawy

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

function pobierz_lokalizacje() {

navigator.geolocation.getCurrentPosition(przetwarzaj_lokalizacje);

}

Funkcja uruchamia metodę getCurrentPosition, która zaraz po odczytaniu lokalizacji przekaże sterowanie do funkcji przetwarzaj_lokalizacje, której przykładowy kod znajduje się poniżej:

function przetwarzaj_lokalizacje (position) {

var latitude = position.coords.latitude;

var longitude = position.coords.longitude;

var accuracy = position.coords.accuracy;

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

}

image

Poniżej pozostałe właściwości jakie mogły być wykorzystane w przykładzie powyżej 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ć szereg 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 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 ustalenia 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 ma nie tylko odzwierciedlenie w dokładności odczytu, ale również ma wpływ na zużycie prądu oraz czas potrzebny na ustalenie 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 prezentuję 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:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

<html xmlns="http://www.w3.org/1999/xhtml"&gt;

<head>

<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0"></script&gt;

<script type="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) {

// Pobieranie lokalizacji

navigator.geolocation.getCurrentPosition(onSuccess, onError, { maximumAge: 0, timeout: 30000, enableHighAccuracy: true });

}

else {

window.status = "Lokalizacja nie jest wspierana przez przeglądarkę internetową.";

}

}

function onSuccess(loc) {

// ustawienie widoku mapy

var lokalizacja = new Microsoft.Maps.Location(loc.coords.latitude, loc.coords.longitude);

map.setView({ center: lokalizacja });

// ustawienie pinezki

var pinezka = new Microsoft.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(‚Nie można ustalić lokalizacji.’);

break;

case 3: // TIMEOUT

alert(‚Przekroczono czas oczekiwania na ustalenie lokalizacji.’);

break;

default:

}

}

</script>

</head>

<body onload="GetLocalization();">

<div id=’mapDiv’ style="position: relative; width: 640px; height: 480px;"></div>

</body>

</html>

Efekt działania:

image

Podsumowanie

Artykuł ten był omówieniem specyfikacji W3C Geolocation API, która została zaimplementowana między innymi w najnowszej przeglądarce Microsoftu, Internet Explorer 9. Artykuł przedstawia omówienie najważniejszych elementów wraz z przykładem pokazującym na mapie lokalizację zwraz z informacją o możliwym błędzie pomiaru.

W omówieniu specyfikacji nie mógł się zawrzeć szczegółowy opis wszystkich aspektów Geolocation API, dlatego zachęcam do zapoznania się z specyfikacją na oficjalnej stronie projektu, link.