Přejít k navigační liště

Zdroják » Webdesign » Geolokace v prohlížeči

Geolokace v prohlížeči

Články Webdesign

Web se čím dál víc přesouvá na mobilní zařízení, čemuž se jednak přizpůsobují webové aplikace, jednak to dává vzniknout zcela novým aplikacím. Velmi často tyto aplikace pracují s geolokací, tedy s určením polohy zařízení, na němž běží. Donedávna bylo zapotřebí vytvářet nativní aplikace, které čtou data ze zařízení; nová specifikace od W3C umožňuje zjišťovat pozici přímo v prostředí prohlížeče.

Jistě znáte všelijaké aplikace založené na geolokaci. Od specifických (navigace, GPS aplikace pro geocaching) až po publikační a komunitní weby typu OnTheRoad nebo Foursquare. A právě takové aplikace donedávna řešily určování polohy pomocí nativních aplikací pro nejrozšířenější typy telefonů – ačkoli jsou samy webové. V této situaci přichází W3C s návrhem specifikace Geolocation API, která sjednocuje způsob, jakým mohou webové aplikace zjišťovat pozici klienta.

Specifikace je velmi jednoduchá a zavádí jeden jediný objekt, dostupný z JavaScriptu, s třemi metodami, které lze pro tyto operace využít. Ze známých prohlížečů podporuje toto API Firefox od verze 3.5 a testovací buildy Chrome. Potěšující je, že toto API je implementováno v mobilním prohlížeči MicroB, použitém v Nokii N900. (Funguje prý i v Safari na iPhone, ale netestoval jsem osobně – pozn.aut.)

Navigator.geo­location

Výše zmíněným objektem, který zavádí Geolocation API, je právě objekt navigator.geolocation. Jakoukoli práci s tímto API bychom proto měli začít jednoduchým testem:

      if (navigator.geolocation) {
          alert("OK: Prohlizec podporuje Geolocation API");
      } else {
          alert("ERR: Prohlizec nepodporuje Geolocation API");
      }

(zkuste si tento kód ve svém prohlížeči: Test podpory Geolocation API)

Pokud prohlížeč projde testem, můžeme použít metody pro získání aktuální pozice.

navigator.geo­location.getCu­rrentPosition()

Základní metodou pro získání pozice je getCurrentPosition(). V minimálním tvaru požaduje jediný parametr, a tím je callback funkce, která je zavolána poté, co je pozice zjištěna, a které je předán objekt s informacemi. Příklad osvětlí:

function showPosition(position) {
   alert("[" + position.coords.latitude + " ; " + position.coords.longitude + "]");
}
if (navigator.geolocation) {
   navigator.geolocation.getCurrentPosition(showPosition);
} else {
   alert("ERR: Prohlizec nepodporuje Geolocation API");
}

(zkuste si tento kód ve svém prohlížeči: Zjištění polohy)

Samosebou to nefunguje jen tak, že by si někdo potají zjišťoval vaši pozici – prohlížeč požádá o svolení, zda může dané webové stránce tyto informace poskytnout. V prohlížeči se vám objeví nějaký podobný dotaz:

Objekt, který je předán callbacku (v našem případě showPosition()) je potomek třídy, která implementuje rozhraní Position. Toto rozhraní definuje dva atributy pouze ke čtení: coords a timestamp. Už názvy napovídají, co který obsahuje – timestamp obsahuje určení data a času a odpovídá typu DOMTimeStamp, coords obsahuje zjištěnou pozici a implementuje rozhraní Coordinates.

Co vyčteme z coords

I když bude leckdy užitečná i informace o tom, kdy byly souřadnice změřeny (timestamp), bude to zajímavější, to, co nás všechny zajímá, obsahovat právě atribut coords. Ten implementuje rozhraní Coordinates, které definuje následující atributy:

  interface Coordinates {
    readonly attribute double latitude;
    readonly attribute double longitude;
    readonly attribute double? altitude;
    readonly attribute double accuracy;
    readonly attribute double? altitudeAccuracy;
    readonly attribute double? heading;
    readonly attribute double? speed;
  };

Atributy latitude a longitude udávají zaměpisnou šířku a délku ve stupních coby desetinné číslo (na minuty a vteřiny je nutno tedy převést). Atribut altitude udává nadmořskou výšku v metrech. Pokud ji zařízení nezná, vrátí null. Přesnost měření je udána atributem accuracy, udává se v metrech a musí být vždy udána jako nezáporné číslo (to je to známé „jsme na Václavském náměstí, plus mínus dvě stě kilometrů“). Obdobou předchozího atributu je altitudeAccuracy, které udává tutéž informaci, ale pro výšku. Poslední dva údaje se vztahují k pohybu: heading udává azimut směru pohybu (tedy informaci o úhlu, který svírá směr pohybu se směrem k severu – při cestě na východ bude 90), speed rychlost pohybu (v metrech za sekundu). U statických zařízení (stolní PC například), kde nelze vůbec s pohybem počítat, by měly nabýt hodnot NaN, pokud nelze určit směr nebo rychlost, měly by odpovídající parametry nabýt hodnoty null.

Použití je, předpokládám, zjevné, ale pro pořádek si předchozí příklad rozšíříme a vypíšeme si dostupné informace:

function showPosition(position) {
    document.write("Latitude: " + position.coords.latitude);
    document.write("<br>Longitude: " + position.coords.longitude);
    document.write("<br>Altitude: " + position.coords.altitude);
    document.write("<br>Accuracy: " + position.coords.accuracy);
    document.write("<br>Altitude accuracy: " + position.coords.altitudeAccuracy);
    document.write("<br>Heading: " + position.coords.heading);
    document.write("<br>Speed: " + position.coords.speed);   
}
if (navigator.geolocation) {
   navigator.geolocation.getCurrentPosition(showPosition);
} else {
    alert("ERR: Prohlizec nepodporuje Geolocation API");
}

(zkuste si tento kód ve svém prohlížeči: Výpis získaných informací)

Možností Geolocation API tím ale nekončí!

Další možnosti getCurrentPosi­tion()

Řekli jsme si, že tato metoda požaduje alespoň jeden parametr. Ve skutečnosti může mít až tři: druhým parametrem je callback, který je zavolán v případě chyby (když se nepodaří zjistit pozici nebo uživatel nedá souhlas s předáním informací). Třetím parametrem je objekt s doplňkovými volbami:

  • enableHighAccu­racy je typu boolean a zapíná vyšší přesnost zjišťování polohy (např. u mobilu nebude počítána triangulací z BTS, ale zapne se GPS). Specifikace neříká, že s tímto příznakem získáme lepší výsledky. Jeho význam by se dal přeložit jako „použij přesnější zjištění polohy, je-li dostupné“.
  • timeout udává čas, který chce aplikace věnovat zjišťování pozice (v milisekundách). Pokud do té doby zařízení není schopno určit polohu, vyvolá chybu (a zavolá výše zmíněný chybový handler). Pokud se čeká na povolení od uživatele, tak se čas počítá až od chvíle, kdy uživatel povolení dá.
  • maximumAge určuje práci s cache. Zařízení si samosebou může změřenou pozici ukládat, a pomocí maximumAge můžeme specifikovat, jak staré měření je pro nás přijatelné (opět v milisekundách). Hodnota 0 znamená, že požadujeme čerstvé měření. Stačí-li nám údaj zjištěný v posledních deseti minutách, zadáme 600000, a hodnota Infinity vyžádá nejnovější údaj z cache.

Vhodnou kombinací těchto hodnot můžeme např. požádat o jakoukoli naměřenou pozici z cache (když nechceme zapínat GPS ani zjišťovat pozici) –  {maximumAge:Infinity, timeout:0}

navigator.geo­location.watchPo­sition()

Tato funkce je podobná předchozí funkci s tím rozdílem, že callback vyvolává periodicky a sleduje tak aktuální pozici průběžně (o tom, co přesně je periodicky, zda to znamená každou sekundu, každých 10 minut nebo při změně pozice, jsem nebyl schopen najít podrobnější informace – pozn.aut.) Při svém zavolání vrátí identifikátor sledovacího procesu. Ten použijeme při ukončení sledování pomocí  navigator.geolocation.clearWatch().

Závěr

Představili jsme si v hrubých rysech možnosti Geolocation API. Další informace nalezne čtenář ve specifikaci Geolocation API, na stránkách Mozilly (Using geolocation) nebo např. v článku HTML5 Geolocation. API je velmi jednoduché a umožňuje celkem snadno doplnit do webových rozhraní některých aplikací možnost získání pozice. Doufejme, že toto API se brzy rozšíří do prohlížečů v mobilních telefonech a tvůrci aplikací se ho naučí využívat – mohlo by to přinést snazší konec proprietárních klientů webových služeb pro konkrétní telefony.

Komentáře

Subscribe
Upozornit na
guest
15 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Petr Patočka

Pro mobilní telefony (nejen) je asi zatím o chlup užitečnější knihovna http://code.google.com/p/geo-location-javascript/, které řeší totéž a funguje na poměrně velké části mobilních přístrojů. Toto řešení plně funguje ve webovém prohlížeči. Viz například http://webcams.cz/m/

Kacer

Škoda, že to nefunguje na Sony Ericsson :(

mc

Je nějaký desktopový prohlížeč, který má implementováno popisované API a je připraven na zjišťování polohy z GPS? Či dokonce má nějaké možnosti v nastavení, kde definuji způsob získávání polohy (z GPS či jinak).

Trochu mne překvapuje, že součástí API je možnost definovat si zda chci získat polohu z přesnějšího zařízení. Očekával bych, že si já v nastavení prohlížeče definuji z čeho bude poloha získávána (například z nějakého GPS daemona, který přímo pracuje s GPS) a aplikace do toho nebudou mluvit.

Štěpán Bechynský

Ve Windows 7 se lze připojit na Location API, které získává informací z připojených „senzorů“ – GPS nebo SW emulace GPS získávájící data z Wifi a IP adresy.

Petr

Zajímavé – jsem na ADSL a je to přesné. (v rámci města)

none_

No ja jsem na domaci wifi, ktera je pripojena do mestske wifi a ukazuje to az uzasne presne (± pul km). Akorat by me zajimalo, jestli to obeslo moji domaci sit a zjistovalo to site v okoli nebo jestli to slo po moji siti k providerovi a od něj to získalo informace.

jfk

Kurnik, tos zajimave to je, diky za clanek. Jen by me zajimalo odkud to info o poloze bere. Ja jsem ze severni moravy, ale jsem VPNkem pripojeny do Praglu a pozici mi to ukazuje na stred staromestskeho namesti :-). Tak by me fakt zajimalo kde to bere.

X

No ja nevim, ale ja jsem podle vseho v New Yourku…

larryboya

mmm, ja som v Košiciach, VPN-kom do Poznane a ukazuje mi to polohu absolútne presne – teda tú košickú! IP to určite nie je…

Michal Augustýn

Pokud dáte souhlas, Firefox posbírá informace o nejbližších přístupových bodech bezdrátového připojení a IP adrese vašeho počítače. Tyto informace zašle výchozímu poskytovateli informací o poloze, Google Location Services, aby zjistil informace o vašem umístění. Předpokládané umístění je pak Firefoxem odesláno stránce, která o tuto informaci požádala.

Zdroj: http://cs.www.mozilla.com/cs/firefox/geolocation/

legoxx

takze ked mam pocitac ktora wifi nema… bude sa to zistovat jedine cez IP?

MaP

2 počítače připojené ke stejnému ADSL modemu – jeden přes wifi, druhý přes ethernet. U ethernetu hlásí pozici Staroměstské náměstí, u wifi se spletli tak o 30 m (hlásí odchylku 150 m). Velký bratr o nás ví všechno.

pmarek

Díky za skvělý článek, zkoušel jsem na HTC Desire (Android 2.1) v defaultním prohlížeči.
Funguje to výborně, ale GPS se nepoužije, dokud nenastavím enableHighAccu­racy:true
Přesnost je dobrá i bez GPS (cca 80 metrů) a s GPS to bylo asi 10 metrů – ale testoval jsem to v budově.

toka

Funguje skvěle, chyba cca 10 m.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.