Andrise programmeerimisalane WIKI

Geograafiliste koordinaatide pärimine

HTML5 tõi endaga kaasa ka Geolocation API (navigator.geolocation), mis võimaldab JavaScriptil kasutada veebilehe vaataja hetke asukoha koordinaate - näiteks saab näidata kaardil külastaja läheduses asuvaid objekte või salvestada koos teatega ka külastaja asukoht teate lisamise hetkel. Võimalusi on palju ning enamus neist on praeguseks veel isegi välja mõtlemata.

Meetod asukoha määramiseks on eri seadmetel erinev. Kõige lihtsam variant on IP alusel umbkaudne määramine, selle abil saab asukohta teada reeglina linna täpsusega. Teine võimalus on kasutada WIFI võrke - olenevalt ümberkaudu leiduvatest WIFI võrkudest määratakse asukoht tänava täpsusega. Mobiilsed seadmed oskavad kasutada ka tugimastide asukohti, mis annab täpsuseks samuti linnaosa/tänava täpsuse. Ja kõige täpsemaks meetodiks on GPS - kui seadmel on GPS tugi olemas, saab teada juba selle täpse asukoha.

Asukoha tuvastamine ei ole hetkel veel väga paljudes brauserites toetatud, seda saab näiteks kasutada Firefox 3.5+ ning iPhone OS 3.0+ brauserites, kuid Internet Exploreris või Chrome's mitte. Samas kuna iPhone on siiski toetatud ning selle telefoni uuematel versioonidel on olemas ka GPS tugi, siis saab konkreetselt sellele platvormile suunatult juba päris lahedaid asju teha.

Asukoha väljastamine ei käi siiski automaatselt, vastasel korral oleks tegu väga suure privaatsusriskiga - veebisaidid saaksid suhteliselt vabalt jälgida oma külastajate liikumist ja asukohti. Seetõttu küsib brauser kasutajalt alati üle, kas too on ikka nõus oma asukohta skriptile avalikustama.


Joonis 1. Asukoha määramise lubamine Mozilla brauseris


Joonis 2. Asukoha määramise lubamine iPhone brauseris

Asukoha pärimine

Sarnaselt SQLite andmebaasi kasutamisele, on geokoordinaatide pärimine asünkroonne tegevus. Koordinaatide päring edastatakse Geolocation API meetodile getCurrentPosition koos callback funktsiooniga, mis käivitatakse koordinaatide leidmise järel ning valikulise error_callback funktsiooniga, mis käivitatakse vea ilmnemisel.

navigator.geolocation.getCurrentPosition(vallback, error_callback);
  • callback on funktsioon, millele edastatakse hetke asukoht parameetriga position
  • error_callback on funktsioon, mis kutsutakse välja parameetriga error juhul kui positsiooni määramisel ilmnes viga
navigator.geolocation.getCurrentPosition(function(position){
    alert("Sinu asukoht on "+position.coords.latitude+", "+position.coords.longitude);
},function(error){
    if(error.code == error.PERMISSION_DENIED)
        alert("Asukohta ei väljastatud!");
});

callback_error funktsioon saab parameetriks GeoPositionError (Safari puhul PositionError) tüüpi veaobjekti, millel on kaks parameetrit - message, mis annab tekstilise veateate ning code, mis ütleb, millega täpselt viga tekkis.

code väärtused võivad olla

  • UNKNOWN_ERROR (numbriline väärtus on 0), mis esineb ootamatutel juhtudel
  • PERMISSION_DENIED (numbriline väärtus on 1), kasutaja ei andnud luba asukoha määramiseks
  • POSITION_UNAVAILABLE (numbriline väärtus on 2), asukohta ei suudetud määrata
  • TIMEOUT (numbriline väärtus on 3), asukoha määramine võttis liiga kaua aega

Veakoodide konstandid saab kätte veaobjektist endast, neid numbrilisena kasutada ei ole vaja.

function error_callback(error){
    if(error.code == error.PERMISSION_DENIED){
        alert("Asukohta ei väljastatud");
    }
}

Asukoha jälgimine

Lisaks hetke asukoha pärimisele, on võimalik asukoha muutusi ka jälgida, lisades selleks vastava sündmuse kuulari watchPosition. Kuularile saadetakse pidevalt asukoha muutuse infot, võimaldades seega näiteks joonistada ekraanile kasutaja liikumistee või hoida kaarti kogu aeg tsentris vastavalt kasutaja asukohale. Kuulari seadmine käib sarnaselt asukoha leidmisele, ainsa vahega, et kui tavaline asukoha leidmine rakendub vaid ühe korra, siis watchPosition rakendub korduval.

var asukoht = navigator.geolocation.watchPosition(callback, error_callback);

Positsiooni jälgmise sündmuse saab välja lülitada clearWatch meetodiga.

navigator.geolocation.clearWatch(asukoht);

Asukoha määramise meetodeid getCurrentPosition ja watchPosition võiks võrrelda window objekti omadustega setTimeout ja setInterval ning clearWatch meetodit clearInterval meetodiga, kus perioodi asemel sõltuvad käivitatavad funktsioonid mitte ajalisest muutusest, vaid asukoha muutustest.

Vaata lisaks