Corso
Quando lavori con dati del mondo reale, non puoi dare per scontato che il dataset contenga tutte le informazioni indispensabili per risolvere il tuo progetto di data science. Molto spesso hai informazioni parziali e devi arricchire i dati con caratteristiche aggiuntive.
Può capitare che il dataset contenga un indirizzo ma, allo stesso tempo, manchino latitudine e longitudine. In quel caso, il primo passo per l’arricchimento è aggiungere questa coppia di coordinate. Chiamiamo questo processo di conversione di un indirizzo in latitudine e longitudine geocoding.
Il geocoding è molto importante in molti ambiti, come real estate, finanza e logistica. Senza questa tecnica, non potresti analizzare e visualizzare i dati su una mappa. In questo tutorial, eseguiremo il geocoding in Python grazie a una libreria salvavita chiamata Geopy. Iniziamo!
Che cos’è il geocoding?
Il geocoding è un processo che consiste nel convertire indirizzi (come "1600 Amphitheatre Parkway, Mountain View, CA") in coordinate geografiche (come latitudine 37.423021 e longitudine -122.083739), che puoi usare per posizionare marker su una mappa o per centrarla. In termini più semplici, è il processo computazionale di trasformare la descrizione di un indirizzo fisico in una posizione sulla superficie terrestre.
Il processo di geocoding spesso prevede l’interpolazione di posizioni spaziali, come strade o particelle, all’interno dell’estensione geografica di una mappa. Le posizioni risultanti vengono restituite come coordinate numeriche, adatte all’uso in analisi spaziali o visualizzazioni su mappa.
Il geocoding utilizza una varietà di fonti dati per convertire un indirizzo in una posizione geografica. La fonte principale è un database di riferimento stradale che contiene i nomi delle strade e gli intervalli di indirizzi all’interno di una specifica contea o area. Altre fonti includono database di codici postali, di nomi di città e di luoghi importanti (come parchi o monumenti).
Il geocoding non riguarda solo l’ottenimento di coordinate per un dato indirizzo. È usato anche in analisi spaziale, data mining e data cleansing. Ad esempio, le aziende usano il geocoding per analizzare informazioni demografiche e guidare campagne di marketing mirate o ottimizzare i percorsi di consegna. Nell’ambito della sicurezza pubblica, il geocoding viene utilizzato per mappare le posizioni degli incidenti di emergenza e inviare rapidamente i soccorsi più vicini.
Nel contesto della data science, il geocoding è un passaggio cruciale nel processo di creazione di visualizzazioni geospaziali e può essere usato in varie applicazioni, come la previsione dei prezzi immobiliari, l’ottimizzazione dei percorsi di consegna e la pianificazione della risposta ai disastri.
Che cos’è Geopy?

Geopy è una libreria Python open source specializzata nell’aggiungere la posizione ai dati tramite un’ampia varietà di servizi di geocoding, come Google Maps, Open StreeMap e ArcGIS.
Potresti chiederti perché non usare direttamente il servizio di geocoding invece della libreria Python. Il bello di Geopy è che puoi sfruttare questi servizi con poche righe di codice. Infatti, Geopy ha implementato una classe per ciascuno di questi servizi e puoi passare facilmente dall’API di un servizio a quella di un altro.
Esempio pratico di progetto di geocoding
In questo articolo analizzeremo il dataset Canada Museum da Kaggle. Fornisce informazioni sui musei situati in Canada. Questa raccolta di musei potrebbe essere utile per prevedere il prezzo degli alloggi Airbnb a Toronto; ad esempio potresti aver notato che l’affitto di un annuncio aumenta quanto più è vicino a punti di interesse, come musei, ristoranti, caffè e così via.
Diamo un’occhiata al dataset:
import pandas as pd
import geopy
l_cols= ['Name','Street Address','City','State','Zipcode']
df = pd.read_csv('/kaggle/input/canada-museums/museums list CAN.csv', encoding = "ISO-8859-1",usecols=l_cols)
df = df[df.City=='Toronto']
df.head()

Da questa panoramica, possiamo vedere che diverse colonne riguardano le informazioni di indirizzo, come il nome del museo, l’indirizzo, la città, lo stato e il CAP.
Per i prossimi passaggi, ci serve una colonna unica che unisca tutte le informazioni di queste colonne. Come possiamo farlo? Il modo più efficiente per concatenare più di due colonne è usare pandas.series.str.cat(), che ci permette di specificare il separatore che vogliamo tra una colonna e l’altra:
df['Country'] = 'Canada'
l_cols_concat = ['Street Address','City','State','Zipcode','Country']
df['unique_address'] = df['Name'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
df.head()

Possiamo creare una variabile stringa ‘address1’ che contiene l’indirizzo univoco della prima riga:
address1 = df['unique_address'].iloc[0]
print(address1)
# Bizune Event Gallery,452 Richmond St W,Toronto,ON,M5V 1Y1,Canada
La useremo nei prossimi passaggi per sperimentare diversi servizi di geocoding su un singolo indirizzo. Una volta chiaro come Geopy estrae la posizione, si può estendere l’operazione a un’intera colonna di un dataframe pandas. Proveremo i seguenti principali provider:
- Google Maps
- OpenStreetMap
- ArcGIS
Geocoding con le API di Google Maps
Il metodo più popolare per convertire gli indirizzi in coordinate è usare le API di Google Maps.
Sebbene Google Maps offra servizi a pagamento, ti dà 200 $ di crediti gratuiti la prima volta che crei l’account.
Per accedere al servizio, devi creare un nuovo account sulla Google Maps Platform. C’è un ottimo tutorial che ti aiuta a generare la chiave API.
GM_API_KEY = 'your_api_key'
from geopy.geocoders import GoogleV3
geolocator = GoogleV3(api_key=GM_API_KEY)
GoogleV3 è la classe implementata per usare le API di Google Maps v3. Per iniziare, possiamo provare a estrarre la posizione da un singolo indirizzo:
location = geolocator.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Dopodiché possiamo provare a estendere questa operazione al campo unique_address che abbiamo creato in precedenza.
def service_geocode(g_locator, address):
location = g_locator.geocode(address)
if location!=None:
return (location.latitude, location.longitude)
else:
return np.NaN
Possiamo usare apply() per applicare la funzione a tutte le righe di unique_address:
df['LAT_LON'] = df['unique_address'].apply(lambda x:service_geocode(geolocator,x))
df[['unique_address','LAT_LON']].head()

Geocoding con le API di OpenStreetMap
Poiché OpenStreetMap è il più grande progetto e database geografico gratuito ed editabile, l’API è gratuita. Per geolocalizzare un singolo indirizzo, ti basta fornire l’email del tuo account OSM come input alla classe Nominatim, invece della chiave API:
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_email")
location = geolocator.geocode(address1)
print(location)
# None
Purtroppo, la posizione restituita dalle API di OpenStreetMap è None perché non riconosce l’indirizzo.
In effetti, questa API ha difficoltà a localizzare molte delle vie nel dataset perché non ha una buona copertura degli indirizzi in tutte le aree.
Per questo motivo, dobbiamo creare un altro campo unique_address_osm con meno informazioni:
l_cols_concat = ['City','State','Country']
df['unique_address_osm'] = df['Street Address'].str.cat(others=df[l_cols_concat], sep=',',na_rep='')
address1_osm = df['unique_address_osm'].iloc[0]
Poi passiamo il nuovo indirizzo e proviamo di nuovo a estrarre latitudine e longitudine dall’indirizzo:
address1_osm = df['unique_address_osm'].iloc[0]
location = geolocator.geocode(address1_osm)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Come prima, applichiamo la funzione service_geocode() all’intera colonna unique_address_osm:
df['LAT_LON_osm'] = df['unique_address_osm'].apply(lambda x: service_geocode(geolocator,x))
df[['unique_address_osm','LAT_LON','LAT_LON_osm']].head()

Anche se non abbiamo specificato il nome del museo, OpenStreetMap restituisce coordinate molto simili a GoogleMapsAPI.
Geocoding con le API di ArcGIS
ArcGIS è un software che consente di analizzare e visualizzare dati geospaziali. Fornisce anche servizi di localizzazione come Google Maps e OpenStreetMap.
from geopy.geocoders import ArcGIS
geolocator_arcgis = ArcGIS()
location = geolocator_arcgis.geocode(address1)
print('Latitude: '+str(location.latitude)+', Longitude: '+str(location.longitude))

Questa volta non ci sono problemi a ottenere la coppia di coordinate. Possiamo procedere estendendo questa operazione a tutti gli indirizzi:
df['LAT_LON_arcgis'] = df['unique_address'].apply(lambda x: service_geocode(geolocator_arcgis,x))
df[['unique_address','LAT_LON','LAT_LON_osm','LAT_LON_arcgis']].head()

Dando un’occhiata alle prime righe del dataset, possiamo vedere che le coppie di coordinate ottenute con ArcGIS sono simili a quelle ottenute prima, con solo una lieve differenza.
Misurare la distanza tra due luoghi
Un’altra funzionalità di Geopy è che ci permette di calcolare la distanza tra due punti. Questo è possibile usando la distanza geodetica ottenuta tra due coppie (latitudine, longitudine).
from geopy.distance import geodesic
point1 = df.LAT_LON_arcgis.iloc[0]
point2 = df.LAT_LON_arcgis.iloc[1]
distance = geodesic(point1, point2)
print('The distance between {} and {} is {} meters'.format(df.Name.iloc[0],df.Name.iloc[1],distance.meters))

La distanza tra questi due musei è di circa 2 chilometri.
Considerazioni finali
Ecco fatto! Hai imparato tre modi diversi per convertire un indirizzo in latitudine e longitudine usando Geopy. Questo è un punto di partenza per analisi di dati geospaziali più complesse e avanzate.
Se ti interessa iniziare con l’analisi geospaziale senza codice, il modo migliore è dare un’occhiata al tutorial di DataCamp Lavorare con i dati geospaziali: guida all’analisi in Power BI.
Per creare visualizzazioni e calcoli più avanzati, Tableau può essere lo strumento perfetto per te. Questo corso di DataCamp Introduzione a Tableau ti permetterà di creare visualizzazioni dinamiche e risolvere qualsiasi problema analitico.
Se sei un fan del linguaggio R, questo ottimo corso è per creare mappe interattive con leaflet. Se sei fedele a Python, valuta di seguire Visualizzare dati geospaziali in Python, che ti aiuta a creare visualizzazioni straordinarie con geopandas e folium.


