4. Veredelung Leaflet

Vorwort zu working directory, Daten und Packages

Die Daten für dieses Tutorial werden über Github zur Verfügung gestellt. Wenn Sie den Code mit eigenen Daten reproduzieren wollten, ersetzen Sie die URL mit ihrem lokalen Dateipfad.

Definieren Sie in diesem Fall Ihren “working directory”, ihr Arbeitsverzeichnis.

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

Dabei handelt es sich um den Dateispeicherort, wo Ihre Daten und Skripte gespeichert sind. Weitere Infos finden Sie hier.

Der Code für das Speichern von Daten und Ergebnissen ist in diesen Tutorials deaktiviert. Ersetzen Sie zum Speichern “YOUR/FILEPATH” mit ihrem gewünschten Dateipfad.

Wir haben den Code zum Laden von packages so geschrieben, dass diese installiert werden, sofern diees noch nicht auf Ihrem PC abgespeichert sind. Anschließend werden diese direkt geladen. Sofern nicht anderweitig spezifiziert werden die packages an einer standardmäßigen Stelle auf Ihrem Computer abgespeichert.

Voraussetzungen

Für die nachfolgen Schritte müssen zunächst folgende R-Pakete installiert werden:

  • leaflet - als führende Open-Source-JavaScript-Bibliothek für mobile, interaktive Karten.
  • rgdal - für den Import von Shapefiles nach R als Spatial data frame.
if (!require(leaflet)) {install.packages("leaflet"); library(leaflet)}
if (!require(rgdal)) {install.packages("rgdal"); library(rgdal)}
if (!require(dplyr)) {install.packages("dplyr"); library(dplyr)}
if (!require(geojsonio)) {install.packages("geojsonio"); library(geojsonio)}
if (!require(sf)) {install.packages("sf"); library(sf)}

Farbgebung

Grunlegend für die Visualisierung von Geoinformationen ist die Zuordnung von Variablen bzw. Eigenschaften und Farben. In R existieren Funktionen, die Farbpaletten für bestimmte Wertebereiche definieren können:

# Call the color function (colorNumeric) to create a new palette function
pal <- colorNumeric(c("red", "green", "blue"), 1:10)

# Pass the palette function a data vector to get the corresponding colors
pal(c(1,6,9))
## [1] "#FF0000" "#52E74B" "#6854D8"

Es gibt drei Farbfunktionen für die kontinuierliche Eingabe: colorNumeric, colorBin und colorQuantile; und eine für die kategorische Eingabe, colorFactor.

Kontinuierliche Daten

Zuerst laden wir einen Datensatz (GeoJSON), der die Geometrien aller Länder der Erde enthält und noch einige zusätzliche Informationen, wie z.B. das Gross Domestic Product (GDP, de: BIP):

# Datenquelle: https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/master/countries.geojson
urlfile <- "https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/countries.geojson"

countries <- st_read(urlfile)
## Reading layer `countries' from data source 
##   `https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/countries.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 177 features and 63 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -180 ymin: -90 xmax: 180 ymax: 83.64513
## Geodetic CRS:  WGS 84
map <- leaflet(countries)

Das GDP ist für jedes Land als kontinuierlich skalierter Wert angegeben:

head(countries$gdp_md_est)
## [1]  22270 110300  21810 184300 573900  18770

Auf der Grundlage des Wertebereichs der vorliegenden GDP-Daten kann eine eigene Farbpalette für die spätere Karte erstellt werden (Hinweis: Neben “Blues” kann auch eine andere Grundfarbe ausgewählt werden):

# Create a continuous palette function
pal <- colorNumeric(
  palette = "Blues",
  domain = countries$gdp_md_est)

Diese Farbpalette kann dann für die Einfärbung der Polygone bzw. Ländergrenzen verwendet werden:

# Apply the function to provide RGB colors to addPolygons
map %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~pal(gdp_md_est))

Wenn Sie die kontinuierlichen Eingabedaten (countries$gdp_md_est) mit diskreten Farbklassen darstellen möchten, kann die Funktion colorBin verwendet werden. Sie erlaubt die exakte Definition von einer bestimmten Anzahl an Farbgruppen (im Beispiel werden sechs :

binpal <- colorBin("Blues", countries$gdp_md_est, 6, pretty = FALSE)

map %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~binpal(gdp_md_est))

MIt der Funktion colorQuantile können die numerischen Eingabedaten auf eine feste Anzahl von Ausgabefarben abgebildet werden (hier werden Quantile verwendet verwednet):

qpal <- colorQuantile("Blues", countries$gdp_md_est, n = 7)
map %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~qpal(gdp_md_est))

Kategoriale Daten

Zur Einfärbung von kategorialen Daten hilft die Funktion colorFactor. Wenn die Farbpalette die gleiche Anzahl von Elementen enthält, wie es Faktorstufen gibt, ist die Zuordnung 1:1, andernfalls wird die Palette interpoliert, um die gewünschte Anzahl von Farben zu erzeugen:

countries$category <- factor(sample.int(5L, nrow(countries), TRUE))

factpal <- colorFactor(topo.colors(5), countries$category)

leaflet(countries) %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~factpal(category))

Zusammenfassung

Für die diskrete Einfärbung von kontinuierlichen Daten existieren die zwei Funktionen colorBin() oder colorQuantile. Sie erstellen eine feste Anzahl von Farbklassen:

  • colorBin(): Definition der Klassenanzahl; feste Werte für die Klassengrenzen; unterschiedlich viele Beobachtungen pro Klasse.

  • colorQuantile(): Definition der Klassenanzahl; Werte für die Klassengrenzen werden so bestimmt, das möglichst gleich viele Beobachtung pro Klasse zugeteilt werden (gleiche Anzahl an Beobachtungen pro Klasse).

Zur kontinuierlichen Einfärbung von kontinuierlichen Daten existiert die Funktion colorNumeric(). Sie erstellt dafür eine Interpolation einer Farbpalette (z.B. Blautöne):

  • colorNumeric(): Die interpolierte Farbpalette wird zur Einfärbung von Beobachtungswerten verwendet.

Mit der Funktion colorFactor() können kategorial skalierte Daten mit diskreten Farbklassen eingefärbt werden. Sie erstellt eine Interpolation einer Farbpalette (z.B. topo.colors()):

  • colorFactor(): Die interpolierte Farbpalette wird zur Einfärbung der Klassenstufen (z.B. Bodentypen) verwendet.

Legende

MIt der Funktion addLegend kann eine Legende einer Karte bzw. ein map widget hinzugefügt werden. Am einfachsten kann die Funktuion verwendet werden indem mittels der Funktion colorNumeric entsprechende Farben und deren Bezeichnungen berechnet werden:

pal <- colorNumeric(
  palette = "YlGnBu",
  domain = countries$gdp_md_est
)
map %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~pal(gdp_md_est)
  ) %>%
  addLegend("bottomright", pal = pal, values = ~gdp_md_est,
    title = "Est. GDP (2010)",
    labFormat = labelFormat(prefix = "$"),
    opacity = 1
  )

Die Funktion addLegend versteht auch andere Funktionen zur Berechnung und Defnition von Farbpaletten:

qpal <- colorQuantile("RdYlBu", countries$gdp_md_est, n = 5)
map %>%
  addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 1,
    color = ~qpal(gdp_md_est)
  ) %>%
  addLegend(pal = qpal, values = ~gdp_md_est, opacity = 1)

Layer ein- und ausblenden

Leaflet bietet die Möglichkeit Layer ein- und auszublenden, sodas der Anwender kontrolliert welche Kartenebene er betrachten möchte.

Daten gruppieren

Mehrere Datenebenen können einer Gruppe zugeordnet werden, sodass die Gruppe als eigener Layer fungiert. Man ordnet Daten bzw. einzelne Layer einer Layergruppe zu, indem man Gruppenparamter für einzelne Layer vergibt. Dabei können viele Layer einem Gruppenlayer angehören, jeder einzelne Layer kann jedoch nur keiner oder maximal einer Gruppe gehören, d.h. ein Layer kann nicht Teil von zwei Gruppenlayern sein.

# Beispieldaten einlesen
urlfile2 <- "https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/lng_lat1.txt"

df <- read.csv(urlfile2, sep = ",", header = TRUE, encoding = "UTF-8")

cloud <- dplyr::filter(df, node_label == "cloud cover")
temp <- dplyr::filter(df, node_label == "temperature level")
precip <- dplyr::filter(df, node_label == "shortterm precipitation")

leaflet() %>%
  addTiles() %>%
  addMarkers(data = cloud, group = "Wolken") %>%
  addMarkers(data = temp, group = "Temperatur") %>%
  addMarkers(data = precip, group = "Niederschlag")

Um den Anwendern die Kontrolle über die einzelnen Gruppenlayer zu ermöglichen bzw. deren Sichtbarkeit steuern, muss die Funktion addLayersControl in das Map Widget implementiert werden:

map <- leaflet(df) %>%
  # Base groups
  addTiles(group = "OSM (default)") %>%
  addProviderTiles(providers$Stamen.Toner, group = "Toner") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  # Overlay groups
  addCircles(data = cloud, ~longitude, ~latitude, 100, stroke = F, group = "Wolken", color= "red") %>%
  addCircles(data = temp, ~longitude, ~latitude, 100 , stroke = F, group = "Temperatur", color= "red") %>%
   addCircles(data = precip, ~longitude, ~latitude, 100 , stroke = F, group = "Niederschlag", color= "blue") %>%
  # Layers control
  addLayersControl(
    baseGroups = c("OSM (default)", "Toner", "Toner Lite"),
    overlayGroups = c("Wolken", "Temperatur", "Niederschlag"),
    options = layersControlOptions(collapsed = FALSE)
  )
map

Die Funktion addLayersControl unterscheidet zwischen sog. Basisgruppen und und sog. Overlaygruppen. Es können immer nur eine Basisgruppe, aber mehrere Overlaygruppen zeitgleich angezeigt werden.

Choroplethenkarten

Zur Erstellung einer Choroplethenkarten, bei der die Gebiete im Verhältnis zur Verteilungsdichte des thematischen Objektes eingefärbt sind, laden wir zuerst wieder einen Beispieldatensatz:

urlfile3 <- "https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/us-states.geojson"
#us  <- geojsonio::geojson_read(urlfile3, what = "sp")
us  <- st_read(urlfile3)
## Reading layer `us-states' from data source 
##   `https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/us-states.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 52 features and 3 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -188.9049 ymin: 17.92956 xmax: -65.6268 ymax: 71.35163
## Geodetic CRS:  WGS 84
class(us)
## [1] "sf"         "data.frame"
names(us)
## [1] "id"       "name"     "density"  "geometry"

Zu Beginn erstellen wir eine einfache Basiskarte, die anschließend eingefärbt werden kann

m <- leaflet(us) %>% 
  addTiles() 

Zur Einfärbung der Polygone kann die Basiskarte nun an die Funktion addPolygons weitergereicht werden:

bins <- c(0, 10, 20, 50, 100, 200, 500, 1000, Inf)
pal <- colorBin("YlOrRd", domain = us$density, bins = bins)

labels <- sprintf(
  "<strong>%s</strong><br/>%g people / mi<sup>2</sup>",
  us$name, us$density
) %>% lapply(htmltools::HTML)

m %>%   addPolygons(
    fillColor = ~pal(density),
    weight = 2,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    highlight = highlightOptions(
      weight = 5,
      color = "#666",
      dashArray = "",
      fillOpacity = 0.7,
      bringToFront = TRUE),
    label = labels,
    labelOptions = labelOptions(
      style = list("font-weight" = "normal", padding = "3px 8px"),
      textsize = "15px",
      direction = "auto")) %>%
  addLegend(pal = pal, values = ~density, opacity = 0.7, title = NULL,
    position = "bottomright")
Previous
Next