3. Vertiefung 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.
Verwendung von Basemaps
Die Leaflet Bibliothek unterstützt als Hintergrundkarten Web Maps über so genannte map tiles.
zunächst wird das Paket von leaflet geladen
if (!require(leaflet)){install.packages("leaflet"); library(leaflet)}
Standardmäßig werden die Kacheln von OpenStreetMap verwendet. Dazu wird die Funktion addTiles() ohne weitere Argumente ausgeführt.
m <- leaflet() %>% setView(lng=7.84505099, lat=47.9934184, zoom = 12)
m %>% addTiles()
Basemaps von Drittanbietern
Alternativ können viele beliebte kostenlose Basiskarten von Drittanbietern mit der Funktion addProviderTiles() hinzugefügt werden, die mit dem Plugin leaflet-providers implementiert wird. Hier finden Sie die komplette Liste.
Zur Vereinfachung enthält Leaflet auch eine benannte Liste aller Drittanbieter von Kacheln, die vom Plugin unterstützt werden. Dies ermöglicht es, die Autovervollständigung Ihrer bevorzugten R-IDE (wie RStudio) zu nutzen und sich nicht an unterstützte Kachelanbieter zu erinnern oder nachzuschlagen; geben Sie einfach providers$ein und wählen Sie eine der Optionen aus. Sie können auch names(provider) verwenden, um alle Basemaps anzuzeigen.
#Third-Party Tiles Namen
names(providers)
m %>% addProviderTiles(providers$Stamen.Toner)
#m %>% addProviderTiles(providers$OpenWeatherMap.PressureContour)
m %>% addProviderTiles(providers$CartoDB.Positron)
m %>% addProviderTiles(providers$Esri.NatGeoWorldMap)
m %>% addProviderTiles(providers$Esri.WorldImagery)
Benutzerdefinierte URLs für Kacheln können ebenfalls als Argument für addTiles() angeben werden.
WMS Layer
Sie können addWMSTiles() verwenden, um WMS (Web Map Service) Kacheln hinzuzufügen. Die folgende Karte zeigt die Basisreflexionsfähigkeit (ein Maß für die Intensität der auftretenden Niederschläge) unter Verwendung eines WMS des Iowa Environmental Mesonet.
leaflet() %>% addTiles() %>% setView(-93.65, 42.0285, zoom = 4) %>%
addWMSTiles(
"http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi",
layers = "nexrad-n0r-900913", #the layer name and represents the "current" composite base reflectivity
options = WMSTileOptions(format = "image/png", transparent = TRUE),
attribution = "Weather data © 2012 IEM Nexrad") # Quellenangaben sind wichtig!!!
#data: https://mesonet.agron.iastate.edu/
Kombination von Tile Layern
Es gibt (quasi) keine Beschränkung in der Anzahl von Basiskarte die in einer Karte verwendet werden; Sie können sie “stacken” (stapeln), indem Sie mehrere Kachelebenen hinzufügen. Dies ist in der Regel nur dann sinnvoll, wenn die oberen Kacheln halbtransparent sind oder über das Optionsargument eine angepasste Deckkraft aufweisen.
m %>% addProviderTiles(providers$MtbMap) %>% # Mountainbikekarte von OSM
addProviderTiles(providers$Stamen.TonerLines,
options = providerTileOptions(opacity = 0.35)) %>% #Lines von Tonerkarte
addProviderTiles(providers$Stamen.TonerLabels) # labels von Toner Karte
Marker
Die Marker sind bereits aus dem Tutorial “Leaflet Intro” bekannt. Marker sind nützlich um Punkte auf einer Karte anzuzeigen. Markerpositionen werden in Lat/Lon ausgedrückt und können entweder als Symbole oder als Kreise dargestellt werden.Jetzt sollen sie weiter angepasst werden.
EXKURS: Welche Datentypen können verwendet werden?
Der Vollständigkeit halber soll hier auf die zahlreichen unterschiedlichen Dateiformate hingewiesen werden, mit denen sich die Marker erstellen lassen:
- SpatialPoints oder SpatialPointsDataFrame-Objekte (aus dem sp-Paket)
- POINT, sfc_POINT und sf-Objekte (aus dem sf-Paket); nur X- und Y-Dimensionen werden berücksichtigt.
- Zweispaltige numerische Matrizen (erste Spalte ist Längengrad, zweite Spalte ist Breitengrad)
- Data frame mit Breiten- und Längengrad-Spalten. Sie können der Markerfunktion explizit mitteilen, welche Spalten die Koordinatendaten enthalten (z.B.
addMarkers(lng = ~Longitude, lat = ~Latitude)), oder die Funktion nach Spalten mit den Bezeichnungen lat/latitude und lon/lng/lang/longitude suchen lassen (Groß-/Kleinschreibung). - Numerische Vektoren als lng- und lat-Argumente zur Verfügung.
Symbole
Symbolmarkierungen werden mit den Funktionen addMarkers oder addAwesomeMarkers hinzugefügt. Wie bei den meisten Layer-Funktionen kann das Popup-Argument verwendet werden, um eine Nachricht hinzuzufügen, die beim Klicken angezeigt werden soll, und die Label-Option kann verwendet werden, um ein Textlabel entweder dynamisch oder statisch anzuzeigen.
Wir verwenden den bereits bekannte Datensatz mit Locations in Freiburg und lassen uns eine der Attributspalten “Position” anzeigen.
urlfile <- "https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/lng_lat1.txt" # get url from github repositury
df <- read.csv(urlfile, sep = ",", header = TRUE, encoding = "UTF-8")
head(df)
## position latitude longitude timestamp
## 1 Freiburg, Tullastrasse 48.02543 7.847819 2017-01-13 08:00:00
## 2 Freiburg, Vauban 47.97601 7.824701 2017-01-13 08:00:00
## 3 Freiburg, Sundgauallee 30 48.00735 7.818589 2017-01-13 08:00:00
## 4 Freiburg, Vauban 47.97601 7.824701 2017-01-13 08:00:00
## 5 Freiburg, Barbarastraße 8 48.00373 7.839775 2017-01-13 08:00:00
## 6 Freiburg, Okenstraße 48.01042 7.858387 2017-01-13 08:00:00
## node_label
## 1 shortterm precipitation
## 2 cloud cover
## 3 temperature level
## 4 shortterm precipitation
## 5 shortterm precipitation
## 6 cloud cover
leaflet(df) %>%
addTiles() %>%
addMarkers(~longitude, ~latitude, popup = ~as.character(position), label = ~as.character(position))# as.character, damit der Text als "String" erkannt wird
# Angabe von Lat/Lon optional
# notice how arguments that vary by group use a tilde, ~, in front of the argument
Symbole individuell anpassen
Benutzerdefinierte Marker können auf zwei verschiedene Weisen angezeigt werden. Entweder über die URL oder als Dateipfad.
Für den einfachen Fall, ein einzelnes Symbol auf einen Satz von Markern anzuwenden, verwenden Sie makeIcon().
# Ggf. auf Urheberrechte achten!
sc_icon <- makeIcon(
iconUrl = "https://raw.githubusercontent.com/RafHo/teaching/master/geodaten_kommunizieren/datasource/sc_icon.png",
iconWidth = 38, iconHeight = 95,
iconAnchorX = 22, iconAnchorY = 94#,
#shadowUrl = "T:/GK2019/work/admin/datasource/sc_icon.png",
#shadowWidth = 50, shadowHeight = 64,
#shadowAnchorX = 4, shadowAnchorY = 62
)
# Schatten hier nicht sehr schön, deshalb weggelassen
leaflet(df) %>%
addTiles() %>%
addMarkers(icon = sc_icon)
Für mehrere Punkte variierender Parameter, kann auch die “icon list” verwendet werden. Sie ermöglicht eine Liste von (benannten oder unbenannten) makeIcon()-Icons zu erstellen und aus dieser Liste nach Position oder Name auszuwählen.
EXKURS: Awesome icons
Das Awesome icons Plugin ermöglicht weitere Einstellungen von Icons.
Die addAwesomeMarkers() Funktion ist ähnlich wie die addMarkers() Funktion, ermöglicht es Ihnen aber zusätzlich, benutzerdefinierte Farben für die Marker sowie Symbole aus den Symbolbibliotheken Font Awesome, Bootstrap Glyphicons und Ion Icons anzugeben.
Im folgenden Beispiel erfolgt die Zuteilung der Markerfarben anhand der Parametereigenschaft. Hierfür erstellen wir eine willkürliche Spalte an werten im ursprünglichen data frame.
df$random_numbers <- c(1:41) # erstelle neue Spalte mit den zahlen 1 bis 466
# Bedingung erstellen
# Klassengrenzen sind willkürlich
getColor <- function(df) {
sapply(df$random_numbers, function(random_numbers) {
if(random_numbers <= 15) {
"blue"
} else {
"red"
} })
}
# awesome icons erstellen
icons <- awesomeIcons(
icon = 'ios-close',
iconColor = 'black',
library = 'ion',
markerColor = getColor(df)
)
leaflet(df) %>%
addTiles() %>%
addAwesomeMarkers(icon=icons, label=~as.character(position))
Punkte
Alternativ zu Markern können auch Kreis-Marker angezeigt werden. Sie sind ähnlich wie normale Kreise (siehe Linien und Formen), nur dass ihr Radius in On-Screen-Pixeln unabhängig von der Zoomstufe konstant bleibt.
leaflet(df) %>%
addProviderTiles(providers$Esri.WorldImagery)%>%
addCircleMarkers() # standard
# oder aber individuell anpassen
# Create a palette that maps factor levels to colors
pal <- colorFactor(c("navy", "red"), domain = c("Freiburg, Herderbau", "Freiburg, Engelbergerstrasse 41"))
leaflet(df) %>%
addProviderTiles(providers$Esri.WorldImagery)%>%
addCircleMarkers(
radius = ~ifelse(position == "Freiburg, Herderbau", 6, 10),
color = ~pal(position),
stroke = FALSE, fillOpacity = 0.5)
Popups
Popups sind kleine Boxen mit Text im HTML Format, die auf einen bestimmten Punkt auf der Karte verweisen. Hier finden Sie zum Editieren solcher HTML-Chunks eine Übersicht nützlicher HTML-Befehle)
Verwenden Sie die Funktion addPopups(), um der Karte ein eigenständiges Popup hinzuzufügen.
# link der Geographie Freiburg
# Beispiel website
content <- paste(sep = "<br/>",
"<b><a href='http://www.geographie.uni-freiburg.de/de'",
"Schreiberstraße 20",
"79098 Freiburg, Germany")
leaflet() %>% addTiles() %>%
addPopups(lng=7.84505099, lat=47.9934184, content,
options = popupOptions(closeButton = FALSE)
)
# Beispiel link und Text
content2 <- paste(sep = "<br/>",
"<b><a href='http://www.geographie.uni-freiburg.de/de'>Geographisches Institut</a></b>",
"Schreiberstraße 20",
"79098 Freiburg, Germany")
leaflet() %>% addTiles() %>%
addPopups(lng=7.84505099, lat=47.9934184, content2,
options = popupOptions(closeButton = FALSE))
Häufig werden Popups so verwendet, dass sie durch anklicken eine Textbox öffnen.
# Für das beispiel werden einige Punkte in Freiburg erstellt.. man könnte dies auch in excel erstellen und einladen...
df2 <- read.csv(textConnection(
"Name,Lat,Long
Flugplatz,48.0217347,7.83498052
Herderbau,48.00334395,7.85343216
Mensa Rempartstr.,47.99274695,7.84643223
Schwarzwaldstadion, 47.9890573,7.89304194
Mundenhof, 48.0151514,7.77805132
Seepark,48.0104604,7.82068344
Green City Hotel Vauban, 47.97424835,7.82807286"
))
# alternativ
my_points.df <-
data.frame(name = c("Flugplatz", "Herderbau", "Mensa Rempartstr.", "Schwarzwaldstadion", "Mundenhof", "Seepark", "Green City Hotel Vauban"),
lon = c(7.83498052, 7.85343216, 7.84643223, 7.89304194,7.77805132, 7.82068344, 7.82807286),
lat = c(48.0217347, 48.00334395, 47.99274695, 47.9890573, 48.0151514, 48.0104604, 47.97424835))
# lädt noch das folgende Paket
if (!require(htmltools)){install.packages("htmltools"); library(htmltools)}
leaflet(my_points.df) %>% addTiles() %>%
addMarkers(~lon, ~lat, popup = ~htmlEscape(name))
Im vorhergehenden Beispiel wurde htmltools::htmlEscape verwendet, um alle Zeichen im Namen zu “bereinigen”, die als HTML interpretiert werden können. Obwohl es für dieses Beispiel nicht notwendig war (da die Restaurantnamen kein HTML-Markup enthielten), ist dies in jeder Situation wichtig, in der die Daten aus einer Datei oder Datenbank oder vom Benutzer stammen können.
Zusätzlich zu den Markern können Sie auch Popups auf Formen wie Linien, Kreise und andere Polygone hinzufügen.
Labels
Ein Label ist ein textueller oder HTML-Inhalt, der an Marker und Formen angehängt werden kann, um immer beim Überfahren mit der Maus angezeigt zu werden. Im Gegensatz zu Popups müssen Sie nicht auf einen Marker/Polygon klicken, um das Label anzuzeigen.
leaflet(my_points.df) %>% addTiles() %>%
addMarkers(~lon, ~lat, label = ~htmlEscape(name))
Markerlabels können mit dem Argument labelOptions der Funktion addMarkers angepasst werden. Das Argument labelOptions kann mit der Funktion labelOptions() gefüllt werden. Wenn noHide = FALSE ist (Standard), wird das Label nur angezeigt, wenn Sie mit der Maus über den Marker fahren; wenn noHide = TRUE gesetzt ist, wird das Label immer angezeigt.
Zusätzlich kann noch der Text des labels angepasst werden.
leaflet() %>% addTiles() %>% setView(-118.456554, 34.09, 13) %>%
addMarkers(
lng = -118.456554, lat = 34.105,
label = "Default Label",
labelOptions = labelOptions(noHide = T)) %>%
addMarkers(
lng = -118.456554, lat = 34.095,
label = "Label w/o surrounding box",
labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
addMarkers(
lng = -118.456554, lat = 34.085,
label = "label textsize 15px",
labelOptions = labelOptions(noHide = T, textsize = "15px")) %>%
addMarkers(
lng = -118.456554, lat = 34.075,
label = "Label custom CSS style",
labelOptions = labelOptions(noHide = T, direction = "bottom",
style = list(
"color" = "red",
"font-family" = "serif",
"font-style" = "italic",
"box-shadow" = "3px 3px rgba(0,0,0,0.25)",
"font-size" = "12px",
"border-color" = "rgba(0,0,0,0.5)"
)))
#You can create labels without the accompanying markers
#using the addLabelOnlyMarkers function.