In questo articolo vedremo come è possibile utilizzare le API Elevation in un dispositivo Android per reperire i dati sull’altitudine di un luogo.
Prima di iniziare bisogna reperire un’Api Key per poter utilizzare questo servizio. Per farlo, bisogna andare all’indirizzo https://developers.google.com/maps/documentation/elevation/start e cliccare sul bottone azzurro “Get a Key“, che si trova nella sezione “Activate the APi and get an API key“. Seguite le operazioni passo passo fino a che non viene generata la chiave.
Nota bene: Senza l’Api Key non è possibile reperire le informazioni.
Nota bene: Per reperire i dati sull’altitudine di un luogo è necessario avere le sue coordinate Gps nella forma Lat/Lon.
Come vengono reperiti i dati
I dati relativi all’altitudine vengono reperite tramite un url che genera una richiesta HTTPS. Il formato dell’url è il seguente:
https://maps.googleapis.com/maps/api/elevation/json?locations=LAT,LON&key=API_KEY
dove, al posto di LAT e LON andiamo a scrivere le coordinate Gps relative al luogo, ed al posto di API_KEY andiamo ad inserire la chiave che abbiamo generato prima di iniziare.
Come risultato ci verrà fornita una risposta codificata nel formato JSON. Tutto quello che dovremo fare sarà acquisire questa risposta ed estrarre il risultato sotto la voce “elevation”. Un esempio di risposta potrebbe essere la seguente:
{
"results" : [
{
"elevation" : 1608.637939453125,
"location" : {
"lat" : 39.73915360,
"lng" : -104.98470340
},
"resolution" : 4.771975994110107
}
],
"status" : "OK"
}
Implementazione per Android
Dato che non esiste un’API vera e propria per Android che ci permetta di avere i dati dell’altitudine, dobbiamo procedere come se fossimo un’applicazione web.
Richiesta HTTP
La prima cosa che dobbiamo fare è una richiesta HTTP con l’url che abbiamo visto precedentemente. Per faro potete implementare una qualsiasi funzione di richiesta HTTP, o potete utilizzare la seguente classe:
public class GetHttp {
public static int GetHttpToServer(String urlLink, StringBuffer response) {
try {
URL obj = new URL(urlLink);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setRequestMethod("GET");
int responseCode = conn.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
} catch (MalformedURLException ex) {
Log.e("GetHttp", Log.getStackTraceString(ex));
return 2;
} catch (NoRouteToHostException ex) {
Log.e("GetHttp", Log.getStackTraceString(ex));
return 3;
} catch (SocketTimeoutException ex){
Log.e("GetHttp", Log.getStackTraceString(ex));
return 4;
} catch (SSLException ex){
Log.e("GetHttp", Log.getStackTraceString(ex));
return 5;
} catch (IOException ex) {
Log.e("GetHttp", Log.getStackTraceString(ex));
return 6;
} catch (Exception e){
Log.e("GetHttp", Log.getStackTraceString(e));
return 7;
}
return 0;
}
}
Come potete vedere, la classe per effettuare una richiesta HTTP (GetHttp) è molto semplice. È composta da un’unica funzione GetHttpToServer che richiede in input l’url per effettuare la richiesta (l’url visto precedentemente) ed uno StringBuffer dove verrà salvato il risultato della richiesta HTTP (la risposta JSON nel nostro caso).
La sezione try{ … } catch { … } serve per verificare che non ci siano stati errori durante la richiesta HTTP. La funzione ritornerà 0 in assenza di errori, mentre ritornerà un valore compreso tra 1-6 relativo all’eccezione sorta (il tipo di errore) e, invece, ritornerà 7 se l’errore generato non è tra quelli previsti.
Nota Bene: Questa classe può essere inserita direttamente nella classe di un’Activity, oppure (metodo migliore), si può creare un file Java in cui inserirla e poi richiamare la funzione all’interno della classe di un Activity.
Estrazione dei dati dalla risposta JSON
Una volta effettuata la richiesta, non ci resta che estrarre i dati dell’Altitudine:
int ret;
double Lat,Lon;
double elevation;
String ApiKey = "XXXXXXXXXXXXXXXX"; //Your Api Key
String url = "https://maps.googleapis.com/maps/api/elevation/json?locations=" + Lat + "," + Lon + "&key="+ApiKey;
StringBuffer response = new StringBuffer();
ret = com.domain.package.GetHttp.GetHttpToServer(url, response);
if (ret == 0)
{
try {
JSONObject jsonObj = new JSONObject(response.toString());
JSONArray resultEl = jsonObj.getJSONArray("results");
JSONObject current = resultEl.getJSONObject(0);
elevation = Double.parseDouble(current.getString("elevation"));
} catch (JSONException e) {
e.printStackTrace();
}
}
Come variabili utilizziamo un intero per il valore di ritorno della GetHttp, due double per latitudine e longitudine (possibile miglioramento: al posto di inserirle direttamente, si possono reperire dal Gps o si possono far inserire dall’utente), una variabile double per salvare il valore dell’altitudine, una stringa per l’API Key ed una per l’url e uno StringBuffer per salvare la risposta del server.
Una volta eseguita la funzione, se il valore di ritorno è 0 (la richiesta HTTP è andata a buon fine), si recupera il valore dell’Altitudine leggendo la risposta JSON nella variabile response. La sezione try{..} catch{…} serve solo per verificare che la lettura del contenuto JSON sia corretto.
Nota Bene: Se volete reperire le informazioni sull’Altitudine, ma nello stesso istante volete eseguire altre operazioni, dovete racchiudere la richiesta in un’altra classe che estende la AsyncTask, in modo da farla eseguire in background senza bloccare l’esecuzione dell’intera applicazione.