9 Karten mit leaflet

leaflet ist eine open-source JavaScript-Bibliothek mit der dynamische Onlinekarten erstellt werden. Das gleichnamige R Paket ermöglicht es, diese Art von Karten auch in R zu erstellen. Die Syntax ist identisch zur mapdeck Syntax. Zuerst wird die Funktion leaflet() aufgerufen, gefolgt von verschiedenen Ebenen mit add*(). Auch hier wird der Pipe Operator %>% verwendet, um die einzelnen Funktionen miteinander zu verknüpfen. Um Punktdaten darzustellen, können die Funktionen addMarkers(), addCircleMarkers() und addAwesomeMarkers() verwendet werden, für Polygondaten addPolygons(), für LINESTRING Geometrien addPolylines() und für Rasterdaten addRasterImage(). Das label Argument kann bei diesen verwendet werden, um eine Box über dem Marker anzuzeigen, wenn der Benutzer seinen Mauszeiger darüber bewegt. Mit addTiles() und addProvidersTiles() können Hintergrundkarten hinzugefügt werden, mit addLegend() eine Legende. leaflet bietet die Möglichkeit, mehrere Hintergrundkarten zu definieren und eine Auswahlfläche hinzuzufügen, um zwischen diesen zu entscheiden. Dafür müssen mehrere addProvidersTiles() Funktionen miteinander verknüpft werden und eine Kontrollbox mit addLayersControl() hinzugefügt werden.

Um eine bestimmte Farbpalette für die Visualisierung einzelner Elemente zu verwenden, können die Helferfunktionen colorNumeric(), colorBin(), colorQuantile() und colorFactor() übergeben werden. Diese benötigen die Farbcodes der Palette (palette) und alle möglichen Werte, die dargestellt werden können (domain). Mit addMiniMap() kann eine kleine Karte zu der großen hinzugefügt werden.

Eine Erweiterung des leaflet Pakets ist leaflet.extras. Mit diesem lassen sich beispielsweise Heatmaps darstellen. Mit addMeasure() wird hier noch ein Maßband hinzugefügt, mit dem die Distanz zwischen zwei Punkten oder die Fläche zwischen mehreren Punkten berechnet werden kann.

Da es sich bei leaflet um eine JavaScript Bibliothek handelt, kann auch JavaScript Code eingebunden werden. Werden beispielsweise mehrere Hintergrundkarten und eine MiniMap hinzugefügt, wird standardmäßig nur die erste Karte als MiniMap angezeigt, auch wenn eine andere Hintergrundkarte ausgewählt wird. Um dieses Verhalten zu ändern, kann über die Funktion htmltools::onRender() JavaScript eingebunden werden.

leaflet() %>%
  addProviderTiles("OpenStreetMap",
    group = "OpenStreetMap"
  ) %>%
  addProviderTiles("Stamen.Toner",
                   group = "Stamen.Toner"
  ) %>%
  addProviderTiles("Stamen.Terrain",
                   group = "Stamen.Terrain"
  ) %>%
  addProviderTiles("Esri.WorldStreetMap",
                   group = "Esri.WorldStreetMap"
  ) %>%
  addProviderTiles("Wikimedia",
                   group = "Wikimedia"
  ) %>%
  addProviderTiles("CartoDB.Positron",
                   group = "CartoDB.Positron"
  ) %>%
  addProviderTiles("Esri.WorldImagery",
                   group = "Esri.WorldImagery"
  ) %>%
  addMiniMap(tiles = c("OpenStreetMap", "Stamen.Toner", "Stamen.Terrain",
                       "Esri.WorldStreetMap", "Wikimedia", "CartoDB.Positron",
                       "Esri.WorldImagery")[1], toggleDisplay = TRUE) %>%
  htmlwidgets::onRender("
    function(el, x) {
      var myMap = this;
      myMap.on('baselayerchange',
        function (e) {
          myMap.minimap.changeLayer(L.tileLayer.provider(e.name));
        })
    }") %>%
  addLayersControl(
    baseGroups = c(
      "OpenStreetMap", "Stamen.Toner",
      "Stamen.Terrain", "Esri.WorldStreetMap",
      "Wikimedia", "CartoDB.Positron", "Esri.WorldImagery"
    ),
    
    position = "topleft"
  ) %>%
  addPolygons(
    data = poly_data,
    color = "#E84A5F"
  ) %>%
  addLegend(
    data = isochrone,
    colors = "#E84A5F",
    labels = unique(poly_data$labs),
    title = "Drivetime",
    opacity = 1, 
    position = "bottomleft"
  ) %>%
  addAwesomeMarkers(
    lat = as.numeric(coords[, 2]), lng = as.numeric(coords[, 1]),
    label = "Starting point", icon = icon.fa
  ) %>%
  addMarkers(
    data = points,
    label = paste(
      "Name: ", points$name, "<br>",
      "Distance from location. ",
      round(points$dstnc, 1), " meters", "<br>",
      "Street: ", points$addr_st
    ) %>%
      lapply(htmltools::HTML)
  )

JavaScript kann auch verwendet werden, um Punktdaten zu Clustern zusammenzufassen, die bei einem Klick auf das jeweilige Cluster expandieren:

References