{leaflet} is a
library that provides beautiful html widget maps. This allow use of
basemaps, and therefore the ability to zoom in on features with the
context that these provide. {simplevis} provides wrapper functions to
map sf
and stars
objects. Arguments in these
have been aligned to {ggplot2} terminology to make things simple for the
user.
For the sf functions:
sf
objectPOINT
/MULTIPOINT
,
LINESTRING
/MULTILINESTRING
, or
POLYGON
/MULTIPOLYGON
geometry typex_var
and y_var
variables are
requiredFor the stars
functions:
stars
objectx_var
and y_var
variables are
requiredThere is no facetting functionality provided for leaflet.
Colouring is the same as that for graphs.
leaf_sf_col(example_point,
col_var = trend_category)
leaf_sf_col(example_polygon,
col_var = density)
leaf_stars_col(example_stars,
col_var = nitrate,
col_method = "bin",
col_breaks_n = 4,
col_na_rm = TRUE)
leaf_stars_col(example_stars,
col_var = nitrate,
col_method = "bin",
col_cuts = c(0, 500, 1000, 2000, Inf),
col_na_rm = TRUE)
leaf_sf_col(example_polygon,
col_var = density,
col_method = "quantile",
col_breaks_n = 4)
leaf_sf_col(example_polygon,
col_var = density,
col_method = "quantile",
col_cuts = c(0, 0.25, 0.5, 0.75, 0.95, 1))
leaf_stars_col(example_stars,
col_var = nitrate,
col_method = "bin",
col_breaks_n = 7,
col_na_rm = TRUE)
The clickable popup will default to a
leafpop::popupTable
of all variables, but popups can be
adjusted to a subset of column using the popup_vars_vctr
argument.
leaf_sf_col(example_point,
col_var = trend_category,
popup_vars_vctr = c("site_id", "median"))
The hover label will default to the colour variable, but can be
adjusted using the label_var
variable.
leaf_sf_col(example_point,
col_var = trend_category,
label_var = site_id)
Users have a basemap
argument that defaults to “light”,
but there are other options.
leaf_sf(example_point,
basemap = "dark")
Legend labels are not as flexible as in the ggplot2 wrapper
functions. You can adjust by using the col_labels
argument,
and providing a manual vector of breaks.
leaf_sf_col(example_point,
col_var = trend_category,
col_labels = c("Better", "Same", "Worse"))
As a leaflet object is produced, you can add additional layers with leaflet - although this may effect popups and labels. Note all objects provided to leaflet functions must be transformed to a CRS of 4326.
leaf_sf_col(example_point,
col_var = trend_category) %>%
leaflet::addPolygons(data = sf::st_transform(example_borders, 4326),
color = "#35B779",
weight = 3,
fillOpacity = 0,
opacity = 1)
A leaflet basemap stack is available for use in shiny apps. It defaults to the top layer being “light”. You can set the bounds by adding a vector or bbox of bounds.
leaf_basemap(bounds = c(166.70047,-34.45676, 178.52966,-47.06345))
You can also specify the basemap top layer.
bb <- rnaturalearth::ne_countries(scale = "small",
country = "Indonesia",
returnclass = "sf") %>%
sf::st_bbox()
leaf_basemap(bounds = bb, basemap = "satellite")
You can add a layer_id
variable to leaf_sf* functions
for use in shiny, which enables you to return a value when the value is
clicked on.
This enables you to program shiny to do specific things when a feature is clicked upon.
For example, if the server.R code downloaded from
shiny_demo()
is updated as follows, a modal dialog can be
created with a graph that compares a feature value with the distribution
of all values.
server.R
, adjust your leaf_sf*
function
by adding a layer_id
variable and then turning the default
popup to FALSE.
leaf_sf_col(
leaf_data(),
col_var = trend_category,
size_point = size_reactive,
col_title = title,
layer_id_var = site_id,
popup = FALSE
)
server.R
, add ObserveEvent
code to
observe when a feature is clicked on, and then add some code to put
something something in a modal dialog box.
observeEvent(input$leaf_marker_click, {
site_median <- leaf_data() %>%
filter(site_id == input$leaf_marker_click$id) %>%
pull(median)
showModal(
modalDialog(
renderPlot(
gg_histogram(example_point, median,
title = paste0(input$leaf_marker_click$id, " compared to all sites"),
theme = gg_theme(font = "Helvetica", size_title = 16, size_body = 15, gridlines_h = TRUE)) +
ggplot2::geom_vline(ggplot2::aes(xintercept = site_median), col = "red")
),
easyClose = TRUE
)
)
})
Note that the input$leaf_marker_click$id
returns the
value of the variable assigned to the layer_id
. The click
event returns input$leaf_marker_click
in this example
because the map_id defaults to “leaf” and this relates to a
circlemarker. Refer here for more
information.