Introductie

Introductie

Stichting Voedselbosbouw Nederland, Groen Ontwikkelfonds Brabant en HAS Hogeschool hebben in mei 2018 een samenwerkingsovereenkomst gesloten voor het ontwikkelen van een voedselbos in de gemeente Meierijstad. Het voedselbos bestaan uit twee locaties, Hardekamp en Boschweg.

Met dit project wil stichting Voedselbosbouw Nederland aantonen dat een bedrijfsmatige exploitatie van een grootschalig voedselbos een economisch verdienmodel kan opleveren voor agrariërs. Gelijktijdig draagt het bij aan een vitale natuur, met een grote biodiversiteit. Voor meer informatie, zie de website van Voedselbos Schijndel.

In 2019 hebben tweedejaars studenten van GMD in het blok Data Driven Design een studie uit in de locatie Hardekamp. Deze locatie ligt in een landschap waarin houtwallen en populierenbossen dominant zijn. De twee percelen worden ook omzoomd door rijen populieren. In de afgelopen jaren werd op Hardekamp vooral snijmaïs geteeld. In 2018 is het terrein ingezaaid met raaigras.

De studenten hebben bodemmonsters verzameld en in het lab de pH, het organisch stofgehalte en een aantal andere bodemeigenschappen bepaald. Met deze data zijn door middel van interpolatie dekkende kaartlagen gecreëerd van deze bodemeigenschappen. Hiernaast zijn een viertal voorbeelden te zien (zie het kaartmenu). In de andere tabs van dit dashboard worden de gemeten waarden zelf gegeven en gevisualiseerd.

Location van het voedselbos

Bodemeigenschappen

Column

pH

OS

Column

Percentage Leem

Bouwvoordikte

Column

Map

Voor het studiegebied is eruit gegaan van circa 5 boringen per hectare. Dit is gedaan door middel van een verspringend grid van 40x50 meter. Dit wil zeggen, 50 meter tussen de boringen en 40 meter afstand tussen de afzonderlijke boorraaien. Waar op de geplande locatie niet geboord kon worden, kan de locatie iets variëren.

Klikken op een witte cirkel geeft je een popup met de gemeten pH, OS, bouwvoordikte en het gehalte leem voor die locatie. De geïnterpoleerde waarden worden getoond zodra je een of meer van de kaarten met bodemeigenschappen (rechtsboven) hebt geselecteerd.

Data

Column

Filters


Geselecteerd: , Gemiddelde pH = , % OS = %, % leem = %, en Bouwvoordikte = cm.

Datatable

Column

Boxplots

Interactive map

Informatie

Over het dashboard


R biedt verschillende tools die het bouwen van interactieve webapplicaties sterk vereenvoudigen. Voor interactieve en dynamische data visualisatie is er allereerst Shiny. Shiny combineert de kracht van R met interactieve webapplicaties. Met Shiny heb je niet alleen de mogelijkheid om op relatief eenvoudige wijze je data te delen en visualiseren, maar ook om je eigen dynamische online applicaties te bouwen.

Het nadeel is dat hiervoor wel een Shiny server nodig is, wat niet altijd voor iedereen praktisch of mogelijk is. Maar ook zonder een Shiny server is het mogelijk om dashboards te creëren voor de visualisatie van verschillende datasets. In feite is het zo simpel als het schrijven van een Rmarkdown document. Voeg daar de magie van flexdashboard en crosstalk aan toe en je hebt een interactief dashboard zoals deze. Hieronder de R tools gebruikt om dit dashboard te maken.

De basis:

De packages voor het creëren van de interactieve html widgets:

  • Leaflet voor de (interactieve) kaarten.
  • DT voor de (interactieve) tabellen.
  • plotly voor de interactieve grafieken.
  • summarywidget voor het uitrekenen van statistieken over door de gebruiker geselecteerde deel van de data.

De packages om het dashboard te creëren

Data verwerking

  • sf voor het werken met ruimtelijke vector data
  • raster voor het werken met raster data in R
  • dplyr voor het verwerken van data in R.

Wil je zelf ook aan de slag met een dashboard? Heb je wel al ervaring met R, maar ben je nog niet bekend met het maken van Rmarkdown documenten? Dan is het een goed idee om daar mee te beginnen. En op de Flexdashboard kun je zien hoe eenvoudig een dashboard op te zetten is.

Het is verder altijd een goed idee om te zoeken naar voorbeelden online. Zie bijvoorbeeld deze blogpost, dit online boek, dit dashboard en de voorbeelden op de Crosstalk website. En je kunt natuurlijk ook de code van dit dashboard bekijken. Ga hiervoor naar Source Code rechtsboven in het menu.

Over de ‘Introductie’ pagina

De Introductie pagina

Op de eerste pagina vind je een korte tekst over het voedselbos en waar de data vandaan komt die in dit dashboard wordt getoond. Op de kaart wordt het gebied getoond, met de volgende mogelijkheden:

  1. Selecteer Openstreetmap of ESRI Satellite als achtergrond kaart.
  2. Toon een kaart met een van de vier bodemeigenschappen.
  3. Meet de afstand tussen twee of meer punten, of teken een vlak en bereken het oppervlakte.

Over de ‘Bodemeigenschappen’ pagina

De bodemeigenschappen

Op de tweede pagina vind je meer informatie over de metingen en geïnterpoleerde waarden van vier bodemeigenschappen.

  1. De verdeling van de gemeten waarden van vier bodemeigenschappen in 78 boorlocaties.
  2. Selecteer lagen met de geïnterpoleerde waarden voor 1 of meer bodemeigenschappen.
  3. De waarde van de geselecteerde lagen op de locatie waar je muis zich bevindt.
  4. De witte circels geven de boorlocaties aan. Als je op een punt klikt krijg je een popup met de waarden van de vier bodemeigenschappen.
  5. Een korte toelichting.

Met de combinatie van 3 en 4 kun je dus ook meteen voor elk punt de geïnterpoleerde waarden vergelijken met de gemeten waarden.

De ‘Data’ pagina

De bodemeigenschappen

Op de Data pagina kun je data op verschillende manieren filteren en selecteren. De resulterende selectie kan geëxporteerd worden als CSV of Excel file, of gecopieerd naar het clipboard. Als je gegevens in de tabel selecteerd worden die ook op de kaart geselecteerd, en andersom.

  1. De tabel met de gemeten waarden van vier bodemeigenschappen in 78 boorlocaties.
  2. Filter de data op pH, OS, leemgehalte en bouwvoordikte.
  3. Activeer of deactiveer het filter om meetpunten te selecteren.
  4. Filter om meetpunten te selecteren.
  5. Vergroot of verklein het filter.
  6. Verplaats het filter.
  7. Bepaal welke kolommen je wilt zien.
  8. Exporteer de tabel als csv of als excel, of kopieer de data naar het clipboard.
  9. Sorteer de tabel op de waarden in een kolom.
  10. Filter om waarden uit de tabel te selecteren.
  11. Aantal geselecteerde meetpunten en de gemiddelde pH, OS, leemgehalte en bouwvoordikte van de geselecteerde punten.
---
title: "Schijndel Forest Garden"
output: 
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: fill
    social: menu
    source_code: embed
    self_contained: FALSE
    theme: flatly
---



```{r setup, include=FALSE}
# Html widgets
library(flexdashboard)
library(leaflet)
library(plotly)
library(crosstalk)
library(summarywidget)
library(DT)
library(d3scatter)

# Spatial data
library(sf)
library(raster)
library(dplyr)

# Visualisation and extras
library(viridis)
library(leafem)
library(leaflet.providers)

# Not used right now
#library(tidyr)
#library(readr)
#library(tmap)
#library(tmaptools)
#library(leafpop)
#library(leaflet.extras)
#library(leaflet.opacity)
#library(leaflet.extras2)
# library(htmltools)

knitr::opts_chunk$set(cache = TRUE)
```


Introductie {data-icon="fa-map-o"}
===================================== 

### Introductie {data-width=200}

Stichting Voedselbosbouw Nederland, Groen Ontwikkelfonds Brabant en [HAS Hogeschool](https://has.nl){target="_blank"} hebben in mei 2018 een samenwerkingsovereenkomst gesloten voor het ontwikkelen van een voedselbos in de gemeente Meierijstad. Het voedselbos bestaan uit twee locaties, Hardekamp en Boschweg.

Met dit project wil stichting Voedselbosbouw Nederland aantonen dat een bedrijfsmatige exploitatie van een grootschalig voedselbos een economisch verdienmodel kan opleveren voor agrariërs. Gelijktijdig draagt het bij aan een vitale natuur, met een grote biodiversiteit. Voor meer informatie, zie de website van [Voedselbos Schijndel](https://www.voedselbosschijndel.nl/){target="_blank"}.

In 2019 hebben tweedejaars studenten van [GMD](https://www.hashogeschool.nl/hbo-opleidingen/geo-media-design-den-bosch){target="_blank"} in het blok *Data Driven Design* een studie uit in de locatie Hardekamp. Deze locatie ligt in een landschap waarin houtwallen en populierenbossen dominant zijn. De twee percelen worden ook omzoomd door rijen populieren. In de afgelopen jaren werd op Hardekamp vooral snijmaïs geteeld. In 2018 is het terrein ingezaaid met raaigras. 

De studenten hebben bodemmonsters verzameld en in het lab de pH, het organisch stofgehalte en een aantal andere bodemeigenschappen bepaald. Met deze data zijn door middel van interpolatie dekkende kaartlagen gecreëerd van deze bodemeigenschappen. Hiernaast zijn een viertal voorbeelden te zien (zie het kaartmenu). In de andere tabs van dit dashboard worden de gemeten waarden zelf gegeven en gevisualiseerd.

### Location van het voedselbos

```{r, message=F, echo=F}
# Get the vector layer with the boundary of the study area and project
mdf <- st_read(dsn="schijndelvoedselbos_samples.gpkg", layer="Locatie_Hardekamp",
               quiet=TRUE)
mdf <- st_transform(mdf, 4326)

# Get the vector layer with some (pending) modifications of the area
xtr1 <- st_read(dsn="schijndelvoedselbos_samples.gpkg", layer=c("Veranderingen"),
               quiet=TRUE)
xtr1 <- st_transform(xtr1, 4326)

# Define the components of the popup
labels <- xtr1$Type
mycols <- colorFactor(palette = c("red", "#75bee3", "#ffc209"), domain = xtr1$Type)
popup <- paste0("

", "

Schijndel Voedselbos
", "Locatie Hardekamp

") # Color legends pal_bouwvoor <- colorNumeric(c("#d7191c", "#fedebe", "#ffffbf", "#abdda4", "#2b83ba"), domain = c(8:77)) pal_os <- colorNumeric(c("#2b83ba", "#9fd5a6", "#ffffbf", "#fec47b", "#d7191c"), domain = c(3:5.1)) pal_ph <- colorNumeric(c("#440154", "#3e4b8a", "#24858e", "#3bbb75", "#fde725"), domain = c(5:7.2)) pal_leem <- colorNumeric(c("#2b83ba", "#9fd5a6", "#ffffbf", "#fec47b", "#d7191c"), domain = c(3.35:40.6)) ``` ```{r, message=F, echo=F} m <- leaflet(width="100%", height="100%", options=leafletOptions(minZoom = 14, maxZoom = 22)) %>% # Add map tile layers addProviderTiles(providers$Esri.WorldImagery, group="ESRI Satellite", options=leafletOptions(maxNativeZoom=19,maxZoom=100)) %>% addTiles(group = "OpenStreetMap", options=leafletOptions(maxNativeZoom=19,maxZoom=100)) %>% addTiles("http://ecodiv.earth/maps/tileserver/OS/{z}/{x}/{y}.png", group="OS", options=leafletOptions(minZoom = 14, maxZoom = 22)) %>% addTiles("http://ecodiv.earth/maps/tileserver/Leem/{z}/{x}/{y}.png", group="Leem", options=leafletOptions(minZoom = 14, maxZoom = 22), layerId = "Leem") %>% addTiles("http://ecodiv.earth/maps/tileserver/pH/{z}/{x}/{y}.png", group="pH", options=leafletOptions(minZoom = 14, maxZoom = 22)) %>% addTiles("http://ecodiv.earth/maps/tileserver/bouwvoor/{z}/{x}/{y}.png", group="bouwvoor", options=leafletOptions(minZoom = 14, maxZoom = 22)) %>% # Set view and extra elements setView(5.459856, 51.628097, zoom = 16) %>% addMeasure( position = "topleft", primaryLengthUnit = "meters", primaryAreaUnit = "sqmeters", activeColor = "#3D535D", completedColor = "#7D4479") %>% # addEasyButton(easyButton( # icon="fa-crosshairs", # title="Mijn locatie", # onClick=JS("function(btn, map){ map.locate({setView: true}); }"))) %>% # Add marker and polygon layer with pending changes to study area addMarkers(5.459856, 51.628097, popup = popup) %>% addPolylines(data=mdf, weight = 3, color = "red", group="Voedselbos", layerId = "Veranderingen") %>% addPolygons(data=xtr1, weight = 6, fillOpacity=0.8, fillColor = ~mycols(Type), stroke = FALSE, group="Veranderingen", opacity = 0.7, label=labels, labelOptions = labelOptions( style = list("font-weight" = "normal", padding = "3px 8px"), textsize = "15px", direction = "auto")) %>% # Add legends veranderingen en bodemeigenschappen addLegend("bottomleft", pal = mycols, values = xtr1$Type, group="Veranderingen") %>% addLegend("bottomright", pal = pal_os, values = c(3:5.1), title = "Organisch stofgehalde (%)", group="OS", opacity = 0.8) %>% addLegend("bottomright", pal = pal_bouwvoor, values = c(8:77), title = "Bouwvoordikte (cm)", group="bouwvoor", opacity = 0.8) %>% addLegend("bottomright", pal = pal_ph, values = c(5:7.2), title = "pH", group="pH", opacity = 0.8) %>% addLegend("bottomright", pal = pal_leem, values = c(3.35:40.6), title = "Leemgehalte", group="Leem", opacity = 0.8) %>% # Add layer control elements addLayersControl(baseGroups = c("OpenStreetMap", "ESRI Satellite"), overlayGroups = c("Veranderingen", "Leem", "pH", "bouwvoor", "OS"), options = layersControlOptions(collapsed = TRUE, autoZIndex = FALSE)) %>% # Set 'bodemlagen' to hide by default hideGroup("OS") %>% hideGroup("Leem") %>% hideGroup("pH") %>% hideGroup("bouwvoor") m ``` Bodemeigenschappen {data-orientation=columns data-icon="fa-bar-chart"} ===================================== ```{r, message=F, echo=F} # Get data sdf <- st_read(dsn="schijndelvoedselbos_samples.gpkg", layer="sampledata", quiet=TRUE) sdf <- sdf[,c(1, 4, 9, 12, 13:20, 22)] coln <- c("boornummer", "Groep", "pH", "OS (%)", "fractie > 2mm", "fractie 1 - 2mm", "fractie 0.43 - 1mm", "fractie 0.15 - 0.43mm", "fractie 0.05 - 0.15 mm", "fractie < 0.05mm", "Leem (%)", "Bouwvoor dikte (cm)", "geom") sdf <- st_transform(sdf, 4326) ``` Column {data-width=1} ------------------------------------- ### pH {.no-title} ```{r} fig <- ggplot(data = sdf, aes(x = pH_gem)) + geom_histogram(color="white", fill="#209f88", bins=12) + labs(y = "Aantal", x = coln[3]) + ggthemes::theme_gdocs() ggplotly(p=fig, dynamicTicks = TRUE, tooltip = "count") ``` ### OS {.no-title} ```{r} # Plot fig <- ggplot(data = sdf, aes(x = Gem_OS)) + geom_histogram(color="white", fill="#209f88", bins=12) + labs(y = "Aantal", x = coln[4]) + ggthemes::theme_gdocs() ggplotly(p=fig, dynamicTicks = TRUE, tooltip = "count") ``` Column {data-width=1} ------------------------------------- ### Percentage Leem {.no-title} ```{r} # Plot fig <- ggplot(data = sdf, aes(x = perc_leem)) + geom_histogram(color="white", fill="#209f88", bins=12) + labs(y = "Aantal", x = coln[11]) + ggthemes::theme_gdocs() ggplotly(p=fig, dynamicTicks = TRUE, tooltip = "count") ``` ### Bouwvoordikte {.no-title} ```{r} # Plot fig <- ggplot(data = sdf, aes(x = Bouwvoordikte)) + geom_histogram(color="white", fill="#209f88", bins=12) + labs(y = "Aantal", x = coln[12]) + ggthemes::theme_gdocs() ggplotly(p=fig, dynamicTicks = TRUE, tooltip = "count") ``` Column {data-width=2} ------------------------------------- ### Map {.no-title} ```{r} # Get the raster layers lf <- list.files("geotif", pattern=".tif$", full.names=TRUE) f <- stack(lf) f <- setMinMax(f) nms <- c("Bouwvoordikte", "OS", "Leem", "pH") # Colors pal_bouwvoor <- colorNumeric(viridis(10), domain = range(na.omit(values(f[[1]]))), na.color = "transparent") pal_os <- colorNumeric(viridis(10), domain = range(na.omit(values(f[[2]]))), na.color = "transparent") pal_leem <- colorNumeric(viridis(10), domain = range(na.omit(values(f[[3]]))), na.color = "transparent") pal_ph <- colorNumeric(viridis(10), domain = range(na.omit(values(f[[4]]))), na.color = "transparent") # Base map bm <- leaflet(width="100%", height="100%") %>% # OS map layer addProviderTiles("OpenStreetMap", options=leafletOptions(maxNativeZoom=19,maxZoom=100)) %>% addProviderTiles(providers$Esri.WorldImagery, group="ESRI Satellite", options=leafletOptions(maxNativeZoom=19,maxZoom=100)) %>% # Boundaries study area addPolylines(data=mdf, weight = 3, color = "red", group="Voedselbos", layerId = "Veranderingen") %>% # Add raster layers addRasterImage(f[[1]], layerId = nms[1], group = nms[1], colors = pal_bouwvoor) %>% addRasterImage(f[[2]], layerId = nms[2], group = nms[2], colors = pal_os) %>% addRasterImage(f[[3]], layerId = nms[3], group = nms[3], colors = pal_leem) %>% addRasterImage(f[[4]], layerId = nms[4], group = nms[4], colors = pal_ph) %>% # Add raster legends addLegend(pal = pal_bouwvoor, values = values(f[[1]]), group = nms[1], opacity = 0.8, title = "Bouwvoordikte (cm)") %>% addLegend(pal = pal_os, values = values(f[[2]]), group = nms[2], opacity = 0.8, title = "Organisch stofgehalde (%)") %>% addLegend(pal = pal_leem, values = values(f[[3]]), group = nms[3], opacity = 0.8, title = "Leemgehalte (%)") %>% addLegend(pal = pal_ph, values = values(f[[4]]), group = nms[4], opacity = 0.8, title = "pH") %>% # Add raster (image) query addImageQuery(x=f[[1]], type="mousemove", layerId =nms[1], digits=2, group = nms[1], position = "topleft") %>% addImageQuery(x=f[[2]], type="mousemove", layerId =nms[2], digits=2, group = nms[2], position = "topleft") %>% addImageQuery(x=f[[3]], type="mousemove", layerId =nms[3], digits=2, group = nms[3], position = "topleft") %>% addImageQuery(x=f[[4]], type="mousemove", layerId =nms[4], digits=2, group = nms[4], position = "topleft") %>% # Sample points addCircleMarkers(data=sdf[, c(1:3, 10, 11)], radius=3, weight=2, color="white", popup = paste("pH:", sdf$pH_gem, "
OS (%):", sdf$Gem_OS, "
Leem (%):", sdf$perc_leem, "
Bouwvoordikte (cm):", sdf$Bouwvoordikte)) %>% # Add layer control elements addLayersControl(baseGroups = c("ESRI Satellite", "OpenStreetMap"), overlayGroups = nms, options = layersControlOptions(collapsed = TRUE, autoZIndex = F)) %>% # Set 'bodemlagen' to hide by default hideGroup(nms[2]) %>% hideGroup(nms[3]) %>% hideGroup(nms[4]) bm ``` > Voor het studiegebied is eruit gegaan van circa 5 boringen per hectare. Dit is gedaan door middel van een verspringend grid van 40x50 meter. Dit wil zeggen, 50 meter tussen de boringen en 40 meter afstand tussen de afzonderlijke boorraaien. Waar op de geplande locatie niet geboord kon worden, kan de locatie iets variëren.

Klikken op een witte cirkel geeft je een popup met de gemeten pH, OS, bouwvoordikte en het gehalte leem voor die locatie. De geïnterpoleerde waarden worden getoond zodra je een of meer van de kaarten met bodemeigenschappen (rechtsboven) hebt geselecteerd. Data {data-orientation=columns data-icon="fa-table"} ===================================== ```{r} # Update the spatial point dataframe to a crossover object sdc <- sdf %>% magrittr::set_colnames(coln) %>% SharedData$new(group="grp01") ``` Column {data-width=400} ------------------------------------ ### Filters {data-height=170} ```{r} bscols( filter_slider("ph", "pH", sdc, column=~pH, step=0.2), filter_slider("os", "OS (%)", sdc, column=~`OS (%)`, step=0.1), filter_slider("leem", "Leem (%)", sdc, column=~`Leem (%)`, step=1), filter_slider("bouwvoor", "Bouwvoordikte (cm)", sdc, column=~`Bouwvoor dikte (cm)`, step=5) ) ```

Geselecteerd: **`r summarywidget(sdc, statistic = 'count')`**, Gemiddelde pH = **`r summarywidget(sdc, statistic = 'mean', column = 'pH', digits = 1)`**, % OS = **`r summarywidget(sdc, statistic = 'mean', column = 'OS (%)', digits = 1)`%**, % leem = **`r summarywidget(sdc, statistic = 'mean', column = 'Leem (%)', digits = 1)`%**, en Bouwvoordikte = **`r summarywidget(sdc, statistic = 'mean', column = 'Bouwvoor dikte (cm)', digits = 1)`cm**.
### Datatable {data-height=600} ```{r width='100%'} DT::datatable(sdc, filter = "top", height='100%', width='100%', rownames = FALSE, extensions = c('Buttons', 'Scroller'), style="bootstrap", class="compact", options = list(dom = 'Blrtip', deferRender=TRUE, scrolly=80, scroller=TRUE, columnDefs = list( list( visible = FALSE, targets = c(0:1, 4:9, 12) ) ), buttons = c(I('colvis'), # turn columns on and off 'copy', # Copy to clipboard 'csv', # Download as csv 'excel'))) # Download as excel ``` Column {data-width=300} ------------------------------------ ### Boxplots {data-height=170 .box-lightgreen} ```{r} p1 <- plot_ly(sdc, x = ~pH, color = I("#209f88")) %>% add_boxplot(name = "pH") %>% layout(xaxis = list(zeroline=FALSE), ticks="", ticklen=0) p2 <- plot_ly(sdc, x = ~`OS (%)`, color = I("#209f88")) %>% add_boxplot(name = "OS (%)") %>% layout(xaxis = list(zeroline=FALSE), ticks="", ticklen=0) p3 <- plot_ly(sdc, x = ~`Leem (%)`, color = I("#209f88")) %>% add_boxplot(name = "Leem (%)") %>% layout(xaxis = list(zeroline=FALSE), ticks="", ticklen=0) p4 <- plot_ly(sdc, x = ~`Bouwvoor dikte (cm)`, color = I("#209f88")) %>% add_boxplot(name = "Bouwvoordikte (cm)") %>% layout(xaxis = list(zeroline=FALSE), ticks="", ticklen=0) s <- subplot(p1, p2, p3, p4, nrows=4, margin=0.04) %>% highlight(on="plotly_selected") %>% layout(showlegend = FALSE, margin = list(l=0, r=0, t=0, b=0), ticks="", ticklen=0) s ``` ### Interactive map {data-height=600} ```{r} bm <- leaflet(sdc, width="100%", height="100%") %>% # OS map layer addProviderTiles(providers$Esri.WorldImagery, group="ESRI Satellite", options=leafletOptions(maxNativeZoom=19,maxZoom=100)) %>% addProviderTiles("OpenStreetMap", options=leafletOptions(maxNativeZoom=19,maxZoom=100)) %>% # Sample points addCircleMarkers(data=sdc, radius=3, weight=2, color="red") %>% # Boundaries study area addPolylines(data=mdf, weight = 3, color = "red", group="Voedselbos") %>% # Add layer control elements addLayersControl(baseGroups = c("OpenStreetMap", "ESRI Satellite"), options = layersControlOptions(collapsed = TRUE, autoZIndex = F)) bm ``` Informatie {.storyboard data-icon="fa-info-circle"} ==================================== ### Over het dashboard

[R](https://www.r-project.org/) biedt verschillende tools die het bouwen van interactieve webapplicaties sterk vereenvoudigen. Voor interactieve en dynamische data visualisatie is er allereerst [Shiny](https://shiny.rstudio.com/){target="_blank"}. Shiny combineert de kracht van R met interactieve webapplicaties. Met Shiny heb je niet alleen de mogelijkheid om op relatief eenvoudige wijze je data te delen en visualiseren, maar ook om je eigen dynamische online applicaties te bouwen. Het nadeel is dat hiervoor wel een Shiny server nodig is, wat niet altijd voor iedereen praktisch of mogelijk is. Maar ook zonder een Shiny server is het mogelijk om dashboards te creëren voor de visualisatie van verschillende datasets. In feite is het zo simpel als het schrijven van een [Rmarkdown](https://rmarkdown.rstudio.com/){target="_blank"} document. Voeg daar de magie van [flexdashboard](https://rmarkdown.rstudio.com/flexdashboard/) en [crosstalk](http://rstudio.github.io/crosstalk/){target="_blank"} aan toe en je hebt een interactief dashboard zoals deze. Hieronder de R tools gebruikt om dit dashboard te maken. De basis: * [R v3.6.3](https://www.r-project.org/){target="_blank"}. * [RStudio v1.3.959](https://www.rstudio.com/){target="_blank"}. De packages voor het creëren van de interactieve html widgets: * [Leaflet](https://rstudio.github.io/leaflet/){target="_blank"} voor de (interactieve) kaarten. * [DT](https://rstudio.github.io/DT/){target="_blank"} voor de (interactieve) tabellen. * [plotly](https://plotly.com/r/){target="_blank"} voor de interactieve grafieken. * [summarywidget](https://kent37.github.io/summarywidget/){target="_blank"} voor het uitrekenen van statistieken over door de gebruiker geselecteerde deel van de data. De packages om het dashboard te creëren * [Flexdashboard](https://rmarkdown.rstudio.com/flexdashboard/){target="_blank"} verzorgt de layout van de verschillende componenten. * [Crosstalk](https://rstudio.github.io/crosstalk/){target="_blank"} verzorgt de interactiviteit tussen de html widgets * [Ion icons](https://ionicons.com/){target="_blank"} and [Font Awesome](https://fontawesome.com/){target="_blank"} for icons Data verwerking * [sf](https://r-spatial.github.io/sf/index.html){target="_blank"} voor het werken met ruimtelijke vector data * [raster](https://rspatial.org/raster/spatial/8-rastermanip.html){target="_blank"} voor het werken met raster data in R * [dplyr](https://dplyr.tidyverse.org/){target="_blank"} voor het verwerken van data in R. Wil je zelf ook aan de slag met een dashboard? Heb je wel al ervaring met R, maar ben je nog niet bekend met het maken van [Rmarkdown](https://rmarkdown.rstudio.com/){target="_blank"} documenten? Dan is het een goed idee om daar mee te beginnen. En op de [Flexdashboard](https://rmarkdown.rstudio.com/flexdashboard/){target="_blank"} kun je zien hoe eenvoudig een dashboard op te zetten is. Het is verder altijd een goed idee om te zoeken naar voorbeelden online. Zie bijvoorbeeld deze [blogpost](http://lenkiefer.com/2017/01/22/a-guide-to-building-an-interactive-flexdashboard/), dit [online boek](https://plotly-r.com/index.html), dit [dashboard](https://matt-dray.github.io/earl18-crosstalk/04_leaflet-flexdash-dt-crosstalk.html) en de voorbeelden op de [Crosstalk](https://rstudio.github.io/crosstalk/index.html) website. En je kunt natuurlijk ook de code van dit dashboard bekijken. Ga hiervoor naar *Source Code* rechtsboven in het menu.
### Over de 'Introductie' pagina
De Introductie pagina Op de [eerste pagina](#Introductie) vind je een korte tekst over het voedselbos en waar de data vandaan komt die in dit dashboard wordt getoond. Op de kaart wordt het gebied getoond, met de volgende mogelijkheden: 1. Selecteer Openstreetmap of ESRI Satellite als achtergrond kaart. 2. Toon een kaart met een van de vier bodemeigenschappen. 3. Meet de afstand tussen twee of meer punten, of teken een vlak en bereken het oppervlakte.
### Over de 'Bodemeigenschappen' pagina
De bodemeigenschappen Op de [tweede pagina](#Bodemeigenschappen) vind je meer informatie over de metingen en geïnterpoleerde waarden van vier bodemeigenschappen. 1. De verdeling van de gemeten waarden van vier bodemeigenschappen in 78 boorlocaties. 2. Selecteer lagen met de geïnterpoleerde waarden voor 1 of meer bodemeigenschappen. 3. De waarde van de geselecteerde lagen op de locatie waar je muis zich bevindt. 4. De witte circels geven de boorlocaties aan. Als je op een punt klikt krijg je een popup met de waarden van de vier bodemeigenschappen. 5. Een korte toelichting. Met de combinatie van 3 en 4 kun je dus ook meteen voor elk punt de geïnterpoleerde waarden vergelijken met de gemeten waarden.
### De 'Data' pagina
De bodemeigenschappen Op de [Data] pagina kun je data op verschillende manieren filteren en selecteren. De resulterende selectie kan geëxporteerd worden als CSV of Excel file, of gecopieerd naar het clipboard. Als je gegevens in de tabel selecteerd worden die ook op de kaart geselecteerd, en andersom. 1. De tabel met de gemeten waarden van vier bodemeigenschappen in 78 boorlocaties. 2. Filter de data op pH, OS, leemgehalte en bouwvoordikte. 3. Activeer of deactiveer het filter om meetpunten te selecteren. 4. Filter om meetpunten te selecteren. 5. Vergroot of verklein het filter. 6. Verplaats het filter. 7. Bepaal welke kolommen je wilt zien. 8. Exporteer de tabel als csv of als excel, of kopieer de data naar het clipboard. 9. Sorteer de tabel op de waarden in een kolom. 10. Filter om waarden uit de tabel te selecteren. 11. Aantal geselecteerde meetpunten en de gemiddelde pH, OS, leemgehalte en bouwvoordikte van de geselecteerde punten.