In diesem Beispiel verwende ich ein Code-Snippet von datascienceplus um Google-Trends Daten basierend auf Stadtnamen in Koordinaten (Longitude, Latitude) umzuwandeln. Diesen Prozess nenne ich „Geocoding“. Geocoding erlaubt mir daraufhin die Visualisierung der örtlichen Verteilung der Suchintensität mittels Leaflet-Wärmekarten.
Nachstehend implementiere ich die „Geocoding“-Funktion in R und verwende sie um ein DataFrame, bzw. die darin enthaltenen Ortsnamen, in Koordinaten zu transformieren. Ich erhalte so bearbeitete DataFrames mit Geo-Koordinaten und Google-Trends Daten.
Die verwendeten Google-Trends Daten sind Daten für die Suchintensität in Deutschland, nach den Suchwörtern „Pizza“ und „Burger“.
# Da der Algorithmus die OpenStreetMap API verwendet, und diese Daten
# in JSON-Format retourniert, wird das jsonlite Paket in R benötigt
#install.packages("jsonlite")
library(jsonlite)
# Dokumentation OpenStreetMap: http://wiki.openstreetmap.org/wiki/Nominatim
# Quelle des nachstehenden Codes:
# https://datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/
osm_geocoder <- function(address = NULL)
{
if(suppressWarnings(is.null(address)))
return(data.frame())
tryCatch(
d <- jsonlite::fromJSON(
gsub('\\@addr\\@', gsub('\\s+', '\\%20', address),
'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
), error = function(c) return(data.frame())
)
if(length(d) == 0)
return(data.frame())
return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}
# Google-Trends Daten einlesen
setwd("C:/Users/Linnart/Desktop/Supply Chain Analytics/08 R coding/01__spatial visualization/Spatial food trends analysis")
# Die eingelesenen Daten sind die Suchintensität nach "Pizza" und "Burger"
# in Deutschland; der Dienst "Google Trends" stellt die Suchintensität der
# Top-Städte bereit, sodass die Suchintensität je Ortsname angegeben wird
input_pizza_map <- read.csv(file="Pizza on map.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
input_burger_map <- read.csv(file="Burger on map.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
#input_burger_and_pizza_map <-read.csv(file="Pizza vs Burger on map.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
#input_burger_and_pizza_timeline <- read.csv(file="Pizza vs Burger.csv",header=TRUE,sep=",",stringsAsFactors = FALSE)
# Eingangsdaten Geocoden
input_pizza_map<-data.frame(input_pizza_map$Town.City,"Lat"=rep(NA,nrow(input_pizza_map)),"Long"=rep(NA,nrow(input_pizza_map)),input_pizza_map$Pizza...2.12.17...2.12.18.)
input_burger_map<-data.frame(input_burger_map$Town.City,"Lat"=rep(NA,nrow(input_burger_map)),"Long"=rep(NA,nrow(input_burger_map)),input_burger_map$Burger...2.12.17...2.12.18.)
# Erst Ortsnamen der "Burger" Suche transformieren (Geocoden)
for(i in 1:nrow(input_burger_map)){
# Geocode-Funktion anwenden
geocodes <- osm_geocoder(address=paste0(input_burger_map$input_burger_map.Town.City[i],", Germany"))
print(input_burger_map$input_burger_map.Town.City[i])
if(nrow(geocodes)>=1){
input_burger_map$Lat[i] <- geocodes$lat[1]
input_burger_map$Long[i]<- geocodes$lon[1]}
# 1 Sekunde lang schlafen um keinen Ärger mit der OSM-API zu bekommen
Sys.sleep(1)
}
# Dann Ortsnamen für Suchwort Pizza transformieren (Geocoding)
for(i in 1:nrow(input_pizza_map)){
# Geocode-Funktion anwenden
geocodes <- osm_geocoder(address=paste0(input_pizza_map$input_pizza_map.Town.City[i],", Germany"))
print(input_pizza_map$input_pizza_map.Town.City[i])
if(nrow(geocodes)>=1){
input_pizza_map$Lat[i] <- geocodes$lat[1]
input_pizza_map$Long[i]<- geocodes$lon[1]}
# 1 Sekunde lang schlafen um keinen Ärger mit der OSM-API zu bekommen
Sys.sleep(1)
}
# DataFrames reinigen bzw. bearbeiten um keine leeren Einträge zu haben
# Hierfür verwende ich das dplyr-Paket
library(dplyr)
cleaned_pizza_map <- input_pizza_map %>% filter(!is.na(Lat))
colnames(cleaned_pizza_map)<-c("City","Lat","Long","Trend")
cleaned_burger_map <- input_burger_map %>% filter(!is.na(Lat))
colnames(cleaned_burger_map)<-c("City","Lat","Long","Trend")
Jetzt erstelle ich mit den bearbeiteten Datentabellen eine Wärmekarte in R. Hierfür verwende ich das Leaflet-Paket:
# Pakete importieren
library(leaflet)
library(leaflet.extras)
library(magrittr)
# Kartenzentrum festlegen
lat_center <- c(cleaned_burger_map$Lat,cleaned_pizza_map$Lat) %>% as.numeric() %>% mean
long_center <- mean(c(cleaned_burger_map$Long,cleaned_pizza_map$Long))
# Wärmekarte für Suchintensität nach "Burger" erstellen
viz_map_burger <- cleaned_burger_map %>%
leaflet() %>%
addTiles() %>%
addProviderTiles(providers$OpenStreetMap.DE) %>%
setView(long_center,lat_center,6) %>%
addHeatmap(lng=~Long,lat=~Lat,intensity=~Trend,max=100,radius=20,blur=10)
# Wärmekarte für Suchintensität nach "Pizza" erstellen
viz_map_pizza <- cleaned_pizza_map %>%
leaflet() %>%
addTiles() %>%
addProviderTiles(providers$OpenStreetMap.DE) %>%
setView(long_center,lat_center,6) %>%
addHeatmap(lng=~Long,lat=~Lat,intensity=~Trend,max=100,radius=20,blur=10)
# Die zwei Wärmekarten nebeneinander plotten
# Hierfür importiere ich noch ein Paket: "mapview"
#install.packages("mapview")
library(mapview)
latticeview(viz_map_burger,viz_map_pizza)
Wirtschaftsingenieur mit Interesse an Optimierung, Simulation und mathematischer Modellierung in R, SQL, VBA und Python
Leave a Reply