Cerca con Google

Translate

22 luglio 2013

Tutorial 52 - Il componente LocationSensor per la geolocalizzazione e la realizzazione di un App meteo (Yahoo Meteo)


Ricordate il Tutorial 51? Oggi andremo a vedere come sia possibile aggiungere il componente "LocationSensor" di App Inventor per realizzare un'applicazione in grado di localizzare il telefono e quindi darci le informazioni meteo relative alla nostra posizione attuale.

Uno dei vantaggi dei moderni smartphone è infatti quello di avere un gran numero di sensori che ci forniscono una quantità enorme di dati, tra questi uno dei più utilizzati è sicuramente il GPS che ci permette di localizzare con esattezza la posizione del telefono in ogni momento.
App Inventor ci mette a disposizione il componente "LocationSensor", lo trovate nella palette "Sensors" assieme ad "AccelerometerSensor" e "OrientationSensor" (che abbiamo trattato parzialmente nel Tutorial 24)

Vogliamo quindi "migliorare" la nostra App creata nel Tutorial 51 per far si che l'utente non debba inserire manualmente il nome della località se vuole sapere le condizioni meteo attuali ma che questa informazione ci venga fornita dal telefono stesso.

Aggiungeremo quindi un pulsante chiamato "Aggiorna Posizione", alla pressione dello stesso attiveremo il "LocationSensor" per il tempo necessario affinchè il telefono recuperi una posizione valida.

Il LocationSensor può essere programmato per cercare la migliore posizione possibile (utilizzando i satelliti GPS) oppure un'approssimazione della posizione attuale (usando i ripetitori GSM o le reti WiFi), in questo tutorial ci basta una posizione di massima e quindi useremo il secondo metodo che è più veloce e consuma meno batteria.

Una volta recuperata longitudine e latitudine attuale (l'evento generato si chiama "LocationSensor1.LocationChanged") andremo ad interrogare la tabella YQL "geo.placefinder" di Yahoo che ci permette di fare quello che in gergo si chiama reverse geocoding, ovvero trovare da delle coordinate lat/long l'indirizzo corrispondente (ad esempio alle coordinate 45.4925,9.29658 si trova la città di Segrate vicino a Milano)

Una volta che la nostra app avrà recuperato questa preziosa informazione potremo continuare sulla falsariga del Tutorial 51 andando a recuperare con il componente Web le informazioni meteo del WOEID relativo.
Per chi non se lo ricordasse il WOEID (Where on Earth Identifier) è un numero che identifica in modo univoco una località nel mondo coperta da Yahoo dal suo servizio di previsioni meteo.

Una volta recuperato anche il WOEID interrogheremo finalmente le API di Yahoo Weather (ad esempio caricando la pagina http://weather.yahooapis.com/forecastrss?w=718345&u=c) ed usando la XML_Extract creata in precedenza visualizzeremo i dati voluti (Temperatura e Umidità)

Il sorgente dell'app è scaricabile da QUA
La discussione sul forum invece la trovate QUA

Buona visione


Per finire guardiamo brevemente le istruzioni del componente LocationSensor prese direttamente dal sito del MIT (e tradotte da me in italiano)

LocationSensor

Questo componente fornisce il posizionamento del device Android, usando il GPS se disponibile o in alternativa i ripetitori GSM o le reti WiFi conosciute.
LocationSensor è un componente non visibile che fornisce informazioni sul posizionamento come longitudine, latitudine, altitudine (se supportato dal dispositivo), e l'indirizzo.
Questo componente fornisce anche il "geocoding" ovvero converte un indirizzo (non per forza quello attuale) a delle coordinate long/lat.
Per funzionare la proprietà Enabled deve essere "true", ed il device deve avere i servizi di localizzazione attivi.

Properties

Accuracy
Indica l'accuratezza in metri.
Altitude
Indica l'altitudine, se disponibile.
AvailableProviders
Lista di tutti i service provider disponibili, come GPS o NETWORK
CurrentAddress
Indirizzo fisico attuale del device (nome della via, paese, etc...)
DistanceInterval
Determina il valore minimo di distanza in metri, che il sensore tenta di usare per inviare una notifica di posizione aggiornata. Per esempio se settato a 5, allora il sensore genera un "LocationChanged" solo dopo che il dispositivo si è spostato di 5 metri. LocationSensor non garantisce che un update verrà ricevuto esattamente dopo questo intervallo, ad esempio potrebbero volerci più di 5 metri per generare l'evento.
Enabled
Se impostato a "true" le informazioni sul posizionamento vengono fornite.
HasAccuracy
Quando è "true" il device può fornire le informazioni sul livello di accuratezza.
HasAltitude
Quando è "true" il device può fornire le informazioni sull'altezza.
HasLongitudeLatitude
Quando è "true" il device può fornire le informazioni su longitudine e latitudine
Latitude
Il valore di latitudine del device.
Longitude
Il valore di longitudine del device.
ProviderLocked
Se impostato a "true" il device non cambierà il suo "service provider"
ProviderName
Il nome del service provider in uso.
TimeInterval
Determina l'intervallo minimo in millisecondi, che il sensore tenta di usare per inviare una notifica di posizione aggiornata. Per esempio se settato a 1000ms, allora il sensore genera un "LocationChanged" solo dopo che sono passati 1000ms. LocationSensor non garantisce che un update verrà ricevuto esattamente dopo questo intervallo, ad esempio potrebbero volerci più di 1000ms per generare l'evento. Di sicuro non verranno generati eventi ad una frequenza inferiore a quella impostata (quindi per esempio mai più di un evento ogni 1000ms)

Events

LocationChanged(number latitude, number longitude, number altitude)
Evento generato quando il device Android registra una nuova posizione.
StatusChanged(text provider, text status)
Evento generato quanto il device Android cambia service provider

Methods

number LatitudeFromAddress(text locationName)
Determina la latitudine dell'indirizzo fornito in locationName
number LongitudeFromAddress(text locationName)
Determina la longitudine dell'indirizzo fornito in locationName

8 commenti:

  1. Ciao , molto interessante, ho provato ad inserire anche l'altitudine ma mi da sempre zero. sai dirmi perchè?

    RispondiElimina
    Risposte
    1. hai guardato se il valore di hasaltitude è "true" perchè forse non tutti i telefoni restituiscono anche il valore dell'altezza (presa da GPS), io non ho mai provato, se puoi prova su telefoni diversi per vedere se cambia il risultato :)

      Elimina
  2. mi da "false" sia con un S3 che con un Xperia; quello che non capisco è perchè con delle app del play store gli stessi telefoni mi danno il valore dell'altitudine

    RispondiElimina
  3. forzando il gps funziona anche l'altitudine.
    i telefoni di ultima generazione hanno molti sensori, tra cui barometro, sensore umidità ,ecc...secondo te è possible fare un'app per far fare al telefono direttamente le previsioni meteo
    ciao

    RispondiElimina
    Risposte
    1. bene,allora hai risolto per quanto riguarda l'altitudine,
      per le previsioni meteo non saprei dirti, non sono un esperto in materia ed AI per esempio non mette a disposizione le info del barometro,
      ad ogni modo non credo sia così semplice fare delle previsioni anche se avessi i dati di pressione, umidità, temp, etc... forse potresti solo fare una stima delle condizioni meteo attuali, i modelli per fare le previsioni del tempo sono molto complessi e richiedono supercomputer per analizzare l'enorme quantità di dati raccolti :)

      Elimina
  4. Dear Sir,

    I can't convert your "Tutorial 52 - The component LocationSensor for geolocation and implementation of a weather app (Yahoo Weather)" in app inventor 2 block. please make is in app inventor 2.
    Oh! one thing when I press current location button than nothing do in my sony xperai t

    Thanking you

    Munir

    RispondiElimina
  5. The AvailableProvider sono i seguenti: gps passive gps network. Io li ho provati tutti facendo anche delle accoppiate come per es. "gps passive" oppure "passive gps" oppure "gps network" ma l'unico che sembra funzionare è solo "network". La posizione NON è precisa ma per questo tipo di applicazione non importa va bene lo stesso. Ma se ci fosse l'esigenza di prelevare una posizione quanto più precisa possibile, come bisognerebbe fare?

    RispondiElimina
  6. Excuse me, sir. Did you know the Distanceinterval = 0 & Timeinterval = 0 of location sensor component mean?

    RispondiElimina