La scorsa settimana abbiamo scritto di come si potesse fare il geocoding degli indirizzi su Tableau Desktop sfruttando l’integrazione con il linguaggio di programmazione R. Come avevamo visto, però, c’erano diverse limitazioni in particolare perché si sfruttavano solo le Table Calculation senza andare a interagire fisicamente sulla base dati. Quindi un’altra alternativa può essere utilizzare Tableau Prep e poi usare i dati finali del flusso direttamente su Tableau Desktop.
Per fare geocoding con Tableau Prep, dobbiamo avere uno script di R già pronto con due funzioni: una quella che farà il vero e proprio geocoding, l’altra che dice a Prep di che tipo saranno i dati.
In sostanza, il nostro script in R sarà così composto sfruttando le API di Google:
library(ggplot2);
library(ggmap);
geocoding <- function(df){
register_google(key = “##################”);
indirizzo <- paste(df$indirizzo, “, Torino, Italia”);
df$indirizzo <- indirizzo;
loc <- geocode(indirizzo, output=”latlon”, source=”google”);
df$latitudine <- loc$lat;
df$longitudine <- loc$lon;
df <- df%>% select(indirizzo, latitudine, longitudine);
return(df);
}
getOutputSchema <- function() {
return(data.frame(
indirizzo = prep_string(),
latitudine = prep_decimal(),
longitudine = prep_decimal()));
}
Qui si possono avere maggiori dettagli sulla struttura degli script per Prep. Una cosa fondamentale è però la presenza del punto e virgola alla fine di ogni riga perché altrimenti R non riesce a eseguire lo script che è stato inserito nello step all’interno del flusso di Tableau Prep.
Una volta che abbiamo questo, possiamo andare su Prep e connetterlo a R. In questo passato articolo, avevamo visto come fare la stessa cosa da Tableau Desktop ma il procedimento anche questa volta è lo stesso. Si va quindi su Help – Setting and Perfomance – Manage Analytics Extension Connection scegliere Rserve e mettere localhost e 6311 rispettivamente come Server e Port.
A questo punto si carica il file, un Excel nel nostro caso, si clicca sul “+” e si sceglie Script. Su Connection Type mettiamo Rserve, scegliamo il nostro Script e mettiamo il Name Funtion “geocoding”, il nome della nostra funzione. A questo punto diamo invio e Prep eseguirà lo script restituendoci il dataset che volevamo.
Lo stesso risultato lo si può ottenere usando le API di Open Street Map (OSM) e uno script di questo tipo:
library(rvest);
library(stringi);
library(jsonlite);
library(tidyverse);
geocoding<- function(df){
name = df$indirizzo;
address = df$indirizzo;
city = “Torino”;
state = “Italia”;
query <- str_replace_all(string = address,pattern = “\\s|,”,replacement = “+”);
src_url <- “https://nominatim.openstreetmap.org/search?q=”;
addr <- paste(address, city, state, sep = “%2C”);
requests <- paste0(src_url, query, “&format=geojson”);
for (i in 1:length(requests)) {
response <- read_html(requests[i]) %>%
html_node(“p”) %>%
html_text() %>%
fromJSON();
lon <- as.numeric(response$features$geometry$coordinates[[1]][1]);
lat <- as.numeric(response$features$geometry$coordinates[[1]][2]);
if(i == 1) {
loc <- tibble(name = name[i], latitude = lat, longitude = lon);
}else{
altro <- tibble(name = name[i], latitude = lat, longitude = lon);
loc <- bind_rows(loc, altro);
df <- loc;
}
}
return(df);
}
getOutputSchema <- function() {
return(data.frame(
name = prep_string(),
latitude = prep_decimal(),
longitude = prep_decimal()));
}
Come abbiamo detto all’inizio del articolo, il vantaggio di usare Tableau Prep per georeferenziare degli indirizzi, è che ora i dati ottenuti possono essere aperti su Tableau Desktop e saranno nella nostra base dati come dato consolidato e non come Table Calculation dipendente dalla vista.
A differenza di prima però abbiamo bisogno che lo script sia salvato e dobbiamo modificarlo su RStudio per decidere cosa ottenere. Nel nostro caso restituisce, ad esempio, solo l’indirizzo, la latitudine e la longitudine. Ma se volessimo avere altri campi presenti nel dataset iniziale, dovremmo aggiungerli nello script per averli nella base dati da usare poi in Tableau Desktop.
Ti è piaciuto questo approfondimento sul geocoding? Faccelo sapere seguendoci sui nostri canali social Facebook, LinkedIn e Twitter!