Un client Python, con API per Google maps services

google maps Python

Impariamo ad utilizzare il Python per poter accedere alle API di Google Maps e scrivere applicazioni e programmi per la geolocalizzazione.

In molti ci avete scritto chiedendoci informazioni su come accedere in modo semplice alle API di Google Maps. La possibilità di ottenere informazioni da inserire nella propria applicazione è allettante, quindi abbiamo pensato di fare un po’ di chiarezza.

Vediamo come.

Come richiedere Google APIs

Per prima cosa occorre dotarsi di una “API key”, vale a dire una stringa alfanumerica per poter accedere all’interfaccia d Google Maps con Python.

Il procedimento è abbastanza semplice:

Accedere al relativo link sul cloud Google. Qui troveremo dettagliatissime istruzioni su come completare il processo di iscrizione e richiesta delle API

Creare un “account di fatturazione”. Niente paura: l’account serve solo qualora si desideri utilizzare la chiave in modalità business. L’account infatti garantisce un minimo giornaliero di accessi a titolo completamente gratuito e non cumulabile. Secondo le specifiche, “Google Cloud offre una prova di addebito di 0,00 $. La prova scade alla fine di 90 giorni o dopo che l’account ha accumulato $300 di addebiti, a seconda dell’evento che si verifica per primo. Puoi annullare l’abbonamento in qualsiasi momento. Google Maps Platform offre un credito mensile ricorrente di $200.

python google mìapsDopo la configurazione, sarà possibile iniziare a utilizzare le API e gli SDK di Google Maps Platform. Google mette a disposizione numerosi tutorial su come creare software e mappe personalizzate e interattive. Basterà acquisire la propria API key e sostituirla nel codice sorgentre della propria applicazione. Notare che l’attivazione del servizio richiede qaualche minuto.

Come configurare l’ambiente di sviluppo

Se utilizzeremo Python, dovremo avere un sistema aggiornato almeno alla versione 3.5.

Ogni richiesta del servizio Web di Google Maps attraverso Python richiede una chiave API o un ID client. Le chiavi API vengono generate nella pagina “Credenziali” della scheda “API e servizi” di Google Cloud Console. Si raccomanda di mantenere segreto il valore della chiave. A questo punto possiamo scaricare il relativo modulo python con il seguente comando:

Se utilizzate il comando python3 per accedere all’interprete da lanciare, ricordatevi di utilizzare il comando pip3 anziché pip.

E’ altresì possibile utilizzare l’opzione Tools/Manage packages all’interno di Thonny.

Se l’installazione è andata a buon fine, viene fornito un programma di esempio per testare la propria chiave:

Il programma configura il sistema, esegue la geocodifica di un indirizzzo in coordinate (Latitudine e Longitudine), esegue la geocodifica inversa da coordinate a indirizzo (se esistente), calcola il percorso per arrivare ad una nuova località (distanza, tempi, eventuali percorsi alternativi) e controlla la correttezza di un indirizzo fornito.

Tutto ciò è molto bello, ma… come estrarre i dati una volta calcolati?

Analizziamo di seguito un nuovo programma creato ad hoc per tale scopo. Per i più pigri, il programma completo si trova su github nel link a fine articolo.

Come utilizzare le API

Per prima cosa occorre inizializzare il programma:

  1. Importiamo il modulo googlemaps e datetime (per i percorsi).
  2. Creiamo un oggetto gmaps attraverso la nostra chiave di accesso.
  3. Definiamo un indirizzo generico sul quale opereremo di seguito.

La geocodifica diretta funziona nel modo seguente:

Creiamo una variabile composta (geocode_result) e vi associamo i dati ricevuti dalla chiamata del metodo .geocode(Indirizzo_generico) dell’oggetto gmaps appena creato.

Prima domanda: cosa contiene geocode result?

Se eseguissimo una print della variabile, otterremmo quanto segue:

Nonostante l’aspetto mostruoso, si tratta di una “semplice” lista con un unico elemento, benché complesso. Tale elemento è composto di un unico dizionario, con sei distinte chiavi:

  • address_components
  • formatted_address
  • geometry
  • location
  • place_id
  • types

Allo stesso modo possiamo accedere ad un (eventiuale) indirizzo attraveso le sue coordinate geografiche:

ottenendo un record simile al precedente.

La seguente sezione di codice ci mostra invece come accedere al percorso tra due località:

o come validare un indirizzo:

Di nuovo il risultato è un record complesso, contenente tutte le istruzioni necessarie per decodificare le informazioni. Sapendo come accedere agli elementi interni della lista, diventa più semplice determinare le informazioni necessarie.

Per i più pigri, vediamo di seguito alcuni esempi utili per la decodifica delle informazioni. Il seguente snippet di codice decodifica l’indirizzo completo a partire dalle coordinate geografiche (Latitudine e Longitudine):

elem costituisce il primo (e unico) elemento della risposta del metodo .reverse_geocode(). Si tratta di un dizionario, esattamente come il metodo .geocode.

Se ne stampiamo la chiave address_components, possiamo vedere l’elenco di informazioni che abbiamo dettagliato in precedenza. Ma noi vogliamo estrarre tali informazioni in modo programmatico, quindi eseguiamo il codice delle righe 8 e 9, enumerando ciascun elemento della relativa chiave (single) del dizionario.

Il programma restituisce il seguente output:

Stampiamo ora alcune componenti dell’indirizzo. Vediamo come accedervi:

Ricapitoliamo:

  • elem è l’elemento della lista.
  • elem[‘address_components’] rappresenta come abbiamo visto la chiave di un dizionario il cui valore è una nuova lista di elementi
  • potremo quindi accedere a ciascuno di questi elementi attraverso il loro indice, come se avessimo un array (elem[‘address_components’][0])
  • ora, l’elemento zero della lista valore della chiave ‘address_components’ è di nuovo un dizionario; potremo accedervi attraverso la sua chiave ‘long_name‘ (elem[‘address_components’][0][‘long_name’])

Voilà… siamo riusciti ad ottenere l’elemento singolo desiderato dal coacervo di dati presentato nella risposta del web service/metodo.

Facile no?

Ma vediamo qualche altra API…

Distanza tra due indirizzi

Attraverso il metodo .distance_matrix impareremo a calcolare la distanza tra die indirizzi:

L’utilizzo del metodo è semplicissimo: viene richiesto l’indirizzo di partenza e un indirizzo di destinazione. Nel nostro caso Indirizzo_generico definito in precedenza e un qualsiasi indirizzo del centro di Roma.

La variabile composta distanza conterrà l’insieme delle informazioni richieste.

Analizziamo il record della risposta, rendendolo più leggibile:

Il dizionario ottenuto ha quattro chiavi:

  • destination_addresses ha come valore una lista di indirizzi di destinazione ( o uno, nel nostro caso, se cerchiamo la distanza tra due città)
  • origin_addresses ha come valore una lista di indirizzi di partenza
  • rows ha come valore una lista di dizionari in cui alla chiave elements fa riferimento una lista di informazioni (distance, duration e status)
  • status riporta lo stato della query

Stampa degli elementi di una geocodifica di un indirizzo

Abbiamo visto in precedenza come “leggere” i dati da un record di risposta di una chiamata gmaps.geocode(). Vediamo ora in che modo automatizzare la procedura, ed estrarre le stesse informazioni da programma:

Anche in questo caso, otteniamo le chiavi del dizionario necessarie ad accedere a ciascuno degli elementi che ci interesssano:

Altre chiamate utili del modulo

Di seguito vedremo come estrarre una stringa completa e preformattata contenente un indirizzo a partire dalle coordinate, senza doverla “costruire” leggendo le varie chiavi dei dizionari nella risposta, quindi estrarremo latitutine e longitudine dal record dell’indirizzo richiesto, magari per posizionare un elemento sulla mappa di riferimento.

Infine calcoleremo l’elevazione sul livello del mare di un dato indirizzo. Anche in questo caso, sarà possibile trovare alcune località sul globo al di sotto del livello del mare, con elevazione negativa.

L’indirizzo formattato è già disponibile nel nostro record di risposta, sotto la chiave ‘formatted_address‘: se non abbiamo necessità di formattazione particolare, o di estrarre i campi separatamente, possiamo utilizzare direttamente questa chiave.

Latitudine e Longitudine vanno invece ricercate in profondità all’interno del nostro record di risposta, come sottochiavi della chiave ‘geometry‘.

Per trovare l’elevazione sul livello del mare, invece, esiste un metodo specifico, ‘elevation(LatLng)‘, che la calcola in base alle coordinate fornite in formato lista.

Come tutte le cose fatte bene, esiste una pagina di documentazione di tutte le API per python messe a disposizione da Google Maps per poter adattare e manipolare correttamente le informazioni necessarie al nostro programma.

Prossimamente pubblicheremo una videoguida su questo stesso argomento per “facilitare” il compito a chi non è abituato a leggere i dati da una pagina.

Il sorgente del programma di esempio che abbiamo utilizzato (senza ovviamente la Google API Key) si trova su Github.

Buona sperimentazione a tutti!

 

Join our groups on Telegram…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.