5. Erste Schritte mit ggmap, ggplot2 und osmdata

Foreword on working directory, data and packages

The Data for this tutorial are provided via Github. In order to reproudce the code with your own data, replace the url with your local filepath

If you work locally, you may define the working directory

setwd("YOUR/FILEPATH") 
# this will not work. if you want to use it, define a path on your computer

This should be the place where your data and other folders are stored. more Information can be found here

Code chunks for saving data and results are disabeled in this tutorial (using a #). Please replace (“YOUR/FILEPATH”) with your own path.

The code is written in such a way, that packages will be automatically installed (if not already installed) and loaded. Packages will be stored in the default location of your computer.

Intro

load the required packages:

if (!require(dplyr)){install.packages("dplyr"); library(dplyr)}
if (!require(ggplot2)){install.packages("ggplot2"); library(ggplot2)}
if (!require(tidyverse)){install.packages("tidyverse"); library(tidyverse)}
if (!require(sp)){install.packages("sp"); library(sp)}
if (!require(ggmap)){install.packages("ggmap"); library(ggmap)}

Das R-Paket “ggmap”

Das R Paket ggmap bietet Funktionen, um Geodaten in Verbindung mit Grundlagenkarten zu visualisieren. Dazu wird die die Grammatik des R-Paketes ggplot2 verwendet, die sich insbesondere dadurch auszeichnet, dass mehrer graphische Ebenen übereinander geplottet werden. Das Ergebnis ist eine Karte, die ausgewählte Geodaten und eine Grundlagenkarte mit orientierenden Kontextinformationen kombiniert (s. https://github.com/dkahle/ggmap).

Download Raster Tiles

Kartenauschnitt

Via Bounding Box (bbox) lowerleftlon (links), lowerleftlat (unten), upperrightlon (rechts), upperrightlat (oben) kann der Kartenausschnitt defniert .

myLocation<-c(7, 47.75, 8.5, 48.25) # ~Großraum Freiburg

Kartentyp

Mit Hilfe der Funktion “get_xymap” kann eine kostenfreie Quelle (get_stamenmap oder get_openstreetmap), den Typ und die Farbe der bestimmt werden. Siehe z.B. ?get_stamenmap.

myMap <- get_stamenmap(bbox=myLocation, maptype="watercolor", crop=TRUE)
ggmap(myMap)

Skala

Je nach Bedarf kann anhand von fest definierten Zoomstufen (3-21) die SKala der Karte angepasst werden (3=Kontinent, 10=Stadt, 21=Gebäude).

myMap <- get_stamenmap(bbox=myLocation, maptype="watercolor", zoom=7)
ggmap(myMap)

Zeichne Datenpunkte auf einer Karte

Daten einlesen

Verwende die Funktion read_csv aus dem Pakte “readr”

urlfile <- "https://raw.githubusercontent.com/RafHo/teaching/master/angewandte_geodatenverarbeitung/datasource/weather_perceptions.csv" # get url from github repositury

# use "urlfile" to read data
data <- readr::read_csv(url(urlfile))

Bounding Box

Ermittel eine Bounding Box basierend auf der räumlichen Verteilung der eingelesenen Daten

bbox <- make_bbox(lon = data$longitude, lat = data$latitude, f = 0.25)

Datenpunkte zeichnen

Alle Datenpunkte werden auf dem Ausschnitt der Bounding Box gezeichnet.

myMap <- get_stamenmap(bbox=bbox, maptype="watercolor", zoom=14)

ggmap(myMap)+
geom_point(aes(x=longitude, y=latitude), data=data, alpha=0.5, color="darkred", size = 1)

Es kann auch ein Subset der Datenpunkte gezeichnet werden, dazu muss eine entsprechende Gruppe aus den Daten herausgefiltert werden, z.B. mit der Funktion “filter” aus dem Paket “dplyr”.

cloud_data <- dplyr::filter(data, node_label=="cloud cover")

ggmap(myMap)+
geom_point(aes(x=longitude, y=latitude), data=cloud_data, color="darkgrey", size = 1.5)

Zur Auswahl betsimmter Daten können auch verschiedene Filterkriterien bzw. logische Operatoren miteinander kombiniert werden:

  • &AND
  • |OR (inklusive)
  • !NOT
Quelle: Wickham&Grolemund (2016): R for Data Science

Quelle: Wickham&Grolemund (2016): R for Data Science

tempcold_data <- dplyr::filter(data, scale_label=="temperature level" &  value_index>=-3 & value_index<=-1)

ggmap(myMap)+
geom_point(aes(x=longitude, y=latitude), data=tempcold_data, color="blue", size = 1)

Symbologie

Die Datenpunkte können auch entsprechend einer Eigenschaft gezeichnet werden. Dazu können Werte eines beliebigen Attributes verwendet werden.

ggmap(myMap)+
geom_point(aes(x=longitude, y=latitude), data=tempcold_data, color="blue", size = tempcold_data$value_index*-1, alpha=0.4)

ggmap(myMap)+
geom_point(aes(x=longitude, y=latitude), data=tempcold_data, color=tempcold_data$end_day, size = tempcold_data$value_index*-1, alpha=.7)

Heatmaps

Vorhandene Datenpunkte können auch entsprechend einer Eigenschaft gezeichnet werden. Dazu können Werte eines beliebigen Attributes verwendet werden.

ggmap(myMap)+
stat_density2d(aes(x=longitude, y=latitude,fill=..level.., alpha=..level..), data=tempcold_data, geom="polygon")+ 
scale_fill_gradient(low = "green", high = "red")+
theme(axis.ticks = element_blank(),
      axis.text = element_blank(),
      legend.position="none")

Exkurs: ggplot2 Grundlagen

if (!require(ggplot2)){install.packages("ggplot2"); library(ggplot2)}

Ein Diagram oder eine Karte erstellen

ggplot bietet vielseitige Funktionen, um im Rahmen von vordefnierten Vorlagen Grafiken zu erzeugen. Die Basisvorlage lautet:

ggplot(data = <DATA>) + <GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))  

Diese Vorlage kann beliebig komplex erweitert werden.

Übung

Führen Sie folgendes aus:

ggplot(data = mpg)

Was sehen Sie da?

Wie viele Zeilen sind in mpg? Wie viele Spalten?

Was beschreibt die Variable drv? Lesen Sie die Hilfe zu ?mpg, um es herauszufinden.

Machen Sie einen Streudiagramm von hwy vs. cyl.

Was passiert, wenn du einen Streudiagramm von class vs. drv machst? Warum ist dies nicht nützlich?

Modifikationen

Um eine Modifikation einer Variablen zuzuordnen, ordnen Sie den Namen der Variablen innerhalb von aes() zu. ggplot2 weist jedem eindeutigen Wert der Variablen automatisch ein eindeutiges Niveau (hier eine eindeutige Farbe) zu. ggplot2 fügt auch eine Legende hinzu, die erklärt, welche Ebenen welchen Werten entsprechen.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, color = class))

Exkurs: Daten von OpenStreetMap laden

if (!require(sf)){install.packages("sf"); library(sf)}
## Warning: Paket 'sf' wurde unter R Version 3.6.2 erstellt
if (!require(osmdata)){install.packages("osmdata"); library(osmdata)}
## Warning: Paket 'osmdata' wurde unter R Version 3.6.3 erstellt

Das R-Paket “osmdata”

Das R Paket osmdta bietet eine Reihe von Funktionen, um Geodaten des OSM-Projekts über ein API zu laden.

Download von OSM-Daten

Der Download von OSM-Daten erfolgt über Abfragen via Overpass API. Dazu wird in der Regel die Basisabfrage opq() mit der Abfrage von spezifischen Eigenschaften kombiniert.

Dazu werden map features (tags) bestehend aus einem key und einem dazugehörigen value verwendet. Eine vollständige Liste der map features (tags) finden Sie hier: https://wiki.openstreetmap.org/wiki/DE:Map_Features

map features (tags) beschreiben spezifische Merkmale von Kartenelementen (Knoten, Wege oder Beziehungen) oder Versionsnummern. Beide Elemente sind frei formatierte Textfelder (strings), stellen aber oft numerische oder andere strukturierte Elemente dar.

Die defnierten OSM-Objekte werden dann heruntergeladen und in R Simple Feature Objekt (sf) mit osmdata_sf () oder als R Spatial Objekt (sp) mit osmdata_sp () konvertiert.

Ein Download von OSM-Daten kann beispielsweise so erfolgen:

fr_cycleway <- opq(bbox = getbb("Freiburg, Germany")) %>% # either use bounding box or geocoding to define research area by ?getbb
  add_osm_feature(key = "highway", value= "cycleway") # define required tags
  
fr_cycleway
## $bbox
## [1] "47.9035777,7.6620055,48.0710579,7.9308444"
## 
## $prefix
## [1] "[out:xml][timeout:25];\n(\n"
## 
## $suffix
## [1] ");\n(._;>;);\nout body;"
## 
## $features
## [1] " [\"highway\"=\"cycleway\"]"
## 
## attr(,"class")
## [1] "list"           "overpass_query"
str(fr_cycleway) #Compactly Display the Structure of an Arbitrary R Object          
## List of 4
##  $ bbox    : chr "47.9035777,7.6620055,48.0710579,7.9308444"
##  $ prefix  : chr "[out:xml][timeout:25];\n(\n"
##  $ suffix  : chr ");\n(._;>;);\nout body;"
##  $ features: chr " [\"highway\"=\"cycleway\"]"
##  - attr(*, "class")= chr [1:2] "list" "overpass_query"

Verwendung von OSM-Daten

Um die Daten zu verwenden, müssen sie vom Objekttyp osmdata in das sp-, sf- oder xml-Format konvertiert werden.

fr_cycleway_sp <- osmdata_sp(fr_cycleway)
fr_cycleway_sf <- osmdata_sf(fr_cycleway)
fr_cycleway_xml <- osmdata_xml(fr_cycleway)

Visualisierung von OSM-Daten

Jetzt können sie auch visualisiert werden. Für die Darstellung mittels ggplot müssen sie als sf-Objekt vorliegen:

ggplot()+
  geom_sf(data=fr_cycleway_sf$osm_lines,
          colour="#238443",
          fill="#004529",
          alpha=.5)+
  labs(x="",y="")

Remeber to give credit to the OSM Contributors when you publish your data. Although Open street map is open data, it is licensed under the Open Data Commons Open Database License.

ggplot()+
  geom_sf(data=fr_cycleway_sf$osm_lines,
          colour="#238443",
          fill="#004529",
          alpha=.5)+
  labs(x="",y="", caption = "© OpenStreetMap contributors")

Export von OSM-Daten

Um die Daten als Shapefiles zu speichern, sollte rgdal geladen sein, da es die notwendige Funktion writeOGR bereitstellt.

if (!require(rgdal)){install.packages("rgdal"); library(rgdal)}

writeOGR(fr_cycleway_sp$osm_lines, dsn="YOUR/FILEPATH", layer = "fr_shapefile", driver = "ESRI Shapefile", overwrite=TRUE)
Previous
Next