Geolokace v prohlížeči

geoapi

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.

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 15

Přehled komentářů

Petr Patočka Jiná možnost pro mobily
Kacer Re: Jiná možnost pro mobily
mc prohlížeč a GPS
Štěpán Bechynský Re: prohlížeč a GPS
Petr Re: prohlížeč a GPS
none_ Re: prohlížeč a GPS
jfk odkud odkud??
Martin Malý Re: odkud odkud??
X Re: odkud odkud??
larryboya Re: odkud odkud??
Michal Augustýn Re: odkud odkud??
legoxx Re: odkud odkud??
MaP Tak jsem udělal pokus
pmarek Test Android 2.1
toka Funguje skvěle
Zdroj: https://www.zdrojak.cz/?p=3223