Categorie
Javascript Programmazione

{JS} API Device Mobile: Geolocation

Cos’è l’API Geolocation?

L’API Geolocation fornisce la possibilità di rilevare la posizione di un dispositivo.
Affinché sia utilizzabile l’utente deve esplicitamente autorizzare il browser o l’applicazione mobile a fornire informazioni sulla propria posizione.
Accedere alla posizione fornisce numerosi possibilità come indicare esercizi pubblici o commerciali nei pressi della località dell’utente, suggerimento di itinerari, pubblicità locale, previsioni meteo ecc.

navigator.geolocation

.geolocation è una proprietà dell’oggetto “navigator” che restituisce un oggetto con metodi che forniscono l’accesso alla posizione del dispositivo.

Metodi

Di seguito i tre metodi disponibili:

MetodoDescrizione
navigator.geolocation.getCurrentPosition()restituisce un oggetto
"GeolocationPosition” con i dati della posizione corrente del dispositivo
navigator.geolocation.watchPosition()restituisce le informazioni della posizione ogni volta che cambia la posizione del dispositivo.
navigator.geolocation.clearWatch()Rimuove watchPosition()

navigator.geolocation.getCurrentPosition()

Il metodo .getCurrentPosition() si occupa di richiedere la posizione; al suo interno è possibile includere fino a tre paramenti per la gestione della posizione.

getCurrentPosition() primo parametro

Il metodo prevede un primo argomento che rappresenta la funzione da eseguire non appena sono rese disponibili le informazioni sulla posizione corrente.

navigator.geolocation.getCurrentPosition(function(posizione){
console.log(posizione);
});

Qualora provassimo ad accedere alla posizione e l’utente non avesse già acconsentito sarà mostrato un messaggio di avviso.
Affinché si possa lavorare con la posizione dell’utente è richiesta la sua l’autorizzazione.

getCurrentPosition() richiede la posizione; la funzione contenuta nel metodo, funzione di callback, prevede un parametro che rappresenta l’oggetto “GeolocationPosition” e contiene al suo interno cosa eseguire con esso.

var informazionePosizione = document.getElementById('outputPosition');

navigator.geolocation.getCurrentPosition(function(GeolocationPositionObject){
output.innerHTML=`La tua posizione attuale:<br>
Latitudine: ${GeolocationPositionObject.coords.latitude}<br>
Logitudine: ${GeolocationPositionObject.coords.longitude}<br>
Accuratezza: ${GeolocationPositionObject.coords.accuracy} metri`
});

Se non visualizzi i tuoi dati ricarica la pagina e acconsenti alla richiesta di rivelazione della tua posizione

Geolocation Position Object

Numerose sono le informazioni accessibili attraverso le proprietà dell’oggetto “GeolocationPosition”:

ProprietàDescrizione
geolocationPosition.coords.latitudela latitudine espressa come valore decimale
geolocationPosition.coords.longitudela longitudine espressa come valore decimale
geolocationPosition.coords.accuracyil livello di accuratezza nel calcolo della posizione espressa in metri
geolocationPosition.coords.altitudel’altitudine espressa in metri
geolocationPosition.coords.altitudeAccuracyil livello di accuratezza nel calcolo dell’altitudine espressa in metri
geolocationPosition.coords.headingla direzione del movimento del dispositivo espressa in gradi di discostamento in senso orario dal nord
geolocationPosition.coords.speedla velocità del movimento del dispositivo espressa in metri al secondo
geolocationPosition.timestampla data e ora del rilevamento della posizione

Le uniche proprietà garantite sono coords.latitudecoords.longitudecoords.accuracy e timestamp.
Le altre non è detto che siano disponibili dal momento che dipendono dall’hardware adottato dal dispositivo.

Ci sono anche situazioni in cui pur essendo supportato il rilevamento della posizione, il dispositivo non è in grado di fornirci le informazioni.

  • l’utente non ha autorizzato il browser o l’applicazione all’utilizzo della funzionalità
  • l’utente è offline
  • l’utente non ha attivato il rilevatore GPS
  • l’utente è in una posizione fuori campo di rilevazione

Questi tipi di problematiche possono essere gestite all’interno del metodo .getCurrentPosition()

.getCurrentPosition() secondo paramentro

Il metodo .getCurrentPosition() oltre alla funzione di callback vista in precedenza che restituisce l’oggetto “GeolocationPosition” prevede la possibilità di passare come secondo parametro una seconda funzione di callback per la gestione delle problematiche viste in precedenza.

Questa seconda callback ritornerà un nuovo oggetto che chiameremo “GeolocationPositionError Object”; questo oggetto avrà una proprietà per la rivelazione del tipo di errore.

Il codice assumerà notevoli dimensione a tal punto da costringerci a dichiararle esternamente le funzioni per poi richiamarle mediante il loro nome all’interno di getCurrentPosition()

function mostraPosizione(GeolocationPositionObject){
...
}
function gestisciErrori(GeolocationPositionErrorObject){
...
}

navigator.geolocation.getCurrentPosition(mostraPosizione,gestisciErrori);
});
Geolocation Position Error Object

L’oggetto per la gestione degli errori contiene un’unica proprietà:

ProprietàDescrizione
GeolocationPositionErrorObject.coderestituisce il valore dell’errore rilevato

I possibili valori sono i seguenti:

ValoreDescrizione
PERMISSION_DENIEDpermesso negato dall'utente
POSITION_UNAVAILABLEimpossibile determinare la posizione corrente
TIMEOUTil rilevamento della posizione impiega troppo tempo
UNKNOWN_ERRORsi è verificato un errore sconosciuto

Potremo gestire la rivelazione dell’errore all’interno della funzione di callback dedicata in questo modo:

function gestisciErrori(GeolocationPositionErrorObject){
	switch(GeolocationPositionErrorObject.code) {
		case GeolocationPositionErrorObject.PERMISSION_DENIED:
			console.log("Permesso negato dall'utente");
			break;
		case GeolocationPositionErrorObject.POSITION_UNAVAILABLE:
			console.log("Impossibile determinare la posizione corrente");
			break;
		case GeolocationPositionErrorObject.TIMEOUT:
			console.log("Il rilevamento della posizione impiega troppo tempo");
			break;
		case GeolocationPositionErrorObject.UNKNOWN_ERROR:
			console.log("Si è verificato un errore sconosciuto");
			break;
	}
}

.getCurrentPosition() terzo paramento

Il terzo parametro che è consentito passare al metodo .getCurrentPosition() è un oggetto, oggetto delle opzioni.

var opzioniPosizione = { 
enableHighAccuracy: true, 
maximumAge: 60000, 
timeout: 5000 
}

navigator.geolocation.getCurrentPosition( mostraPosizione, gestisciErrore, opzioniPosizione);

Questo oggetto da noi compilato andrà a gestire alcune caratteristiche della gestione della posizioni ed influirà anche su eventuali errori.

Le proprietà compilabili sono le seguenti:

ProprietàDescrizione
enableHighAccuracyvalore booleano true/false che abilita o meno un’alta accuratezza nel rilevamento della posizione
timeoutvalore che indica la quantità massima di millisecondi entro cui ottenere informazioni sulla posizione corrente
maximumAgevalore che indica il tempo espresso in millisecondi per cui è possibile riutilizzare una posizione precedentemente rilevata
enableHighAccuracy proprietà

Un dispositivo ha molteplici modi per rilevare la posizione dell’utente;
queste possono essere più o meno precise:

  • indirizzo IP l’accuratezza è scarsa: in genere si riesce ad identificare un territorio come una città se non la provincia;
  • rete cellulare dipende dalla densità di celle presenti intorno all’utente; l’accuratezza può variare da centinaia di metri o chilometri;
  • GPS offre invece una precisione dell’ordine di qualche metro.

Un dispositivo cerca di sfruttare tutte le opzioni disponibili fornendo l’informazione ottenuta più velocemente, non necessariamente la più precisa.
Valorizzando la proprietà “enableHighAccuracy” con “true” richiediamo, se è possibile, di fornirci la migliore.

timeout proprietà

La proprietà “timeout” potrà contenere un valore espesso in millisecondi che indica il tempo massimo entro cui è possibile attendere le informazioni sulla posizione corrente.
Questo può fornirci un filtro maggiore prima della restituzione dell’errore “GeolocationPositionErrorObject.TIMEOUT” dell’oggetto “PositionError”.

maximumAge proprietà

La proprietà “maximumAge” potrà contenere un valore espresso in millisecondi che indica per quanto tempo memorizzare in una sorta di cache la posizione dell’utente in modo da poterla riutilizzare per richieste successive.

navigator.geolocation.watchPosition()

Se necessitiamo di rilevare la posizione dell’utente ogni qualvolta ci sia una cambiamento della stessa, parliamo quindi di un monitoraggio continuo della posizione corrente (es. navigatore per auto di Google), anziché utilizzare il metodo .getCurrentPosition() dovremo utilizzare il metodo .watchPosition().
L’utilizzo rimane pressoché lo stesso:

navigator.geolocation.watchPosition(mostraPosizione,gestisciErrori, opzioniPosizione);
});

Il metodo rileverà la posizione corrente dell’utente ad intervalli regolari;
questi intervalli sono indicabili all’interno dell’oggetto “opzioniPosizione” e nella relativa proprietà “timeout”.

navigator.geolocation.clearWatch()

Con il metodo .clearWatch() terminiamo il monitoraggio continuo;
il metodo prevede un paramento che sarà la variabile che avremo utilizzato per memorizzare il processo di rilevamento.

var monitoraggioContinuo = navigator.geolocation.watchPosition(mostraPosizione,gestisciErrori, opzioniPosizione);
});

navigator.geolocation.clearWatch(monitoraggioContinuo);

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *