Introduction
This is my second R Notebook (from RStudio) and tests the mapping leaflet package developed by RStudio but extensively contributed to by Bhaskar Karambelkar.
Bhaskar has blogged about providing a set of plugins to the R package and the latest version of leaflet includes many of these
This notebook takes some of the examples from the vignette and documentation but, of course, the code is easily amendable and alternative data can be selected for processing.
Just open up the - downloadable from Dropbox - leaflet.nb.html in Rstudio or in the R console with the rmarkdown package and an editable notebook version is created for you to mess around with. You will need to have the three libraries listed below installed and loaded
library(leaflet)
library(purrr)
# library(readxl)
library(shiny)
library(dplyr)
The purrr package is particularly useful for handling lists and good coverage can be found in it’s author, Hadley Wickham’s, R for Data Science co-authored with Garrett Grolemund and Jenny Bryan’s tutorial
Dataset
Here is the familiar dataset that is used in the vignette. Adding the print statement results in a table (when in notebook format) with the option of the traditional layout
#print(glimpse(mtcars))
Providers
There are more than 100 base maps available from 18 providers. Here is a simple way of selecting and viewing by provider
#provider.details is a list of all providers with their variations and additional info
# It can be used as an input
# choices <-sort(names(providers.details))
# selectInput("providers", "Choose Provider",choices, selected="HERE")
# base map centredwith lat and lon of zero and a zoom level of 2
m <- leaflet() %>% setView(0,0,2) # nothing showing until we set tiled from the providers
choice <- "Esri"
# Extract ESRI provided tiles - leaves the 11 esri ones there
esri <- providers %>%
purrr::keep(~ grepl('^Esri',.))
esri %>%
purrr::walk(function(x) m <<- m %>% addProviderTiles(x,group=x))
m %>%
addLayersControl(
baseGroups = names(esri),
options = layersControlOptions(collapsed = TRUE)
)
Labels
The label plug in enables many options to be applied. For once a pertinent use of a newbies “Hello world” example.In this code, there are several variables that can be amended to change thee look of the output
leaflet() %>% addTiles() %>%
setView(lng = -0, lat = 60, zoom = 2) %>%
addCircleMarkers(
lng = -50,
lat = 80,
fillOpacity = 0, #3 relook at
radius = 0.00001, ## relook at
label = 'Hello World',
labelOptions = labelOptions(
noHide = T,
textsize = "60px",
textOnly = T,
style = list('color' = 'blue',
'font-family' = 'serif')
)
)
Measurements
One of my sons needs to train for a 400 metres race but can’t be bothered to go to a local track. Luckily we have the Lynn Valley Park nearby. Q. Will this suffice? A.Try out the add_measure() function
leaflet() %>%
addTiles() %>%
fitBounds(-123.035,49.338, -123.040,49.342) %>%
addMeasure(
position = "bottomleft",
primaryLengthUnit = "meters",
primaryAreaUnit = "sqmeters",
activeColor = "#3D535D",
completedColor = "#FF709C",
localization='en'
)
I just click on the options in bottom-left and calculate distance
Close enough!
More examples
Other functions
There are a few more covered in the vignette and some of the functions above also may have additional parameters. Check them out
LS0tDQp0aXRsZTogImxlYWZsZXQgTm90ZWJvb2siDQphdXRob3I6ICJBbmRyZXcgQ2xhcmsiDQpkYXRlOiAic29tZWRheSBzb29uIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgIHRvYzogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoaXMgaXMgbXkgc2Vjb25kICBSIE5vdGVib29rIChmcm9tIFtSU3R1ZGlvXShodHRwczovL2Jsb2cucnN0dWRpby5vcmcvKSkgYW5kIHRlc3RzIHRoZSBtYXBwaW5nIFtsZWFmbGV0IHBhY2thZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9zZmlya2UvamFuaXRvcikgZGV2ZWxvcGVkIGJ5IFJTdHVkaW8gYnV0IGV4dGVuc2l2ZWx5IGNvbnRyaWJ1dGVkIHRvIGJ5IFtCaGFza2FyIEthcmFtYmVsa2FyXShodHRwczovL3R3aXR0ZXIuY29tL2JoYXNrYXJfdmspLiANCg0KQmhhc2thciBoYXMgW2Jsb2dnZWRdKGh0dHA6Ly93d3cua2FyYW1iZWxrYXIuaW5mby8yMDE2LzA5L2xlYWZsZXQtZGlhcnktcHJvbG9ndWUvKSBhYm91dCBwcm92aWRpbmcgYSBzZXQgb2YgcGx1Z2lucyB0byB0aGUgUiBwYWNrYWdlIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbGVhZmxldCBpbmNsdWRlcyBtYW55IG9mIHRoZXNlIA0KDQpUaGlzIG5vdGVib29rIHRha2VzIHNvbWUgb2YgdGhlIGV4YW1wbGVzIGZyb20gdGhlIHZpZ25ldHRlIGFuZCBkb2N1bWVudGF0aW9uIGJ1dCwgb2YgY291cnNlLCB0aGUgY29kZSBpcyBlYXNpbHkgYW1lbmRhYmxlIGFuZCBhbHRlcm5hdGl2ZSBkYXRhIGNhbiBiZSBzZWxlY3RlZCBmb3IgcHJvY2Vzc2luZy4gICAgDQoNCkp1c3Qgb3BlbiB1cCB0aGUgIC0gZG93bmxvYWRhYmxlIGZyb20gRHJvcGJveCAtIFtsZWFmbGV0Lm5iLmh0bWxdKGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzI1OTQ1NTk5L2phbml0b3IubmIuaHRtbD9kbD0xKSBpbiBSc3R1ZGlvIG9yIGluIHRoZSBSIGNvbnNvbGUgd2l0aCB0aGUgcm1hcmtkb3duIHBhY2thZ2UgYW5kIGFuIGVkaXRhYmxlIG5vdGVib29rIHZlcnNpb24gaXMgY3JlYXRlZCBmb3IgeW91IHRvIG1lc3MgYXJvdW5kIHdpdGguIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgdGhyZWUgbGlicmFyaWVzIGxpc3RlZCBiZWxvdyBpbnN0YWxsZWQgYW5kIGxvYWRlZA0KDQoNCg0KDQpgYGB7ciBsaWJyYXJpZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KHB1cnJyKQ0KIyBsaWJyYXJ5KHJlYWR4bCkNCiNsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShkcGx5cikgDQoNCmBgYA0KDQoNClRoZSBbcHVycnJdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYWRsZXkvcHVycnIpIHBhY2thZ2UgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgaGFuZGxpbmcgbGlzdHMgYW5kIGdvb2QNCmNvdmVyYWdlIGNhbiBiZSBmb3VuZCBpbiBpdCdzIGF1dGhvciwgSGFkbGV5IFdpY2toYW0ncywgW1IgZm9yIERhdGEgU2NpZW5jZV0oaHR0cDovL3I0ZHMuaGFkLmNvLm56LykgY28tYXV0aG9yZWQgd2l0aCBHYXJyZXR0IEdyb2xlbXVuZCBhbmQgSmVubnkgQnJ5YW4ncyBbdHV0b3JpYWxdKGh0dHBzOi8vamVubnliYy5naXRodWIuaW8vcHVycnItdHV0b3JpYWwvKQ0KDQojIERhdGFzZXQNCkhlcmUgaXMgdGhlIGZhbWlsaWFyIGRhdGFzZXQgdGhhdCBpcyB1c2VkIGluIHRoZSB2aWduZXR0ZS4gQWRkaW5nIHRoZSBwcmludCBzdGF0ZW1lbnQgcmVzdWx0cyBpbiBhIHRhYmxlICh3aGVuIGluIG5vdGVib29rIGZvcm1hdCkgd2l0aCB0aGUgb3B0aW9uIG9mIA0KdGhlIHRyYWRpdGlvbmFsIGxheW91dA0KDQoNCmBgYHtyIGRhdGF9DQoNCiNwcmludChnbGltcHNlKG10Y2FycykpDQoNCmBgYA0KDQojUHJvdmlkZXJzDQoNClRoZXJlIGFyZSBtb3JlIHRoYW4gMTAwIFtiYXNlIG1hcHMgYXZhaWxhYmxlXShodHRwczovL3QuY28vODJjeHk0WXo3SCkgZnJvbSAxOCBwcm92aWRlcnMuDQpIZXJlIGlzIGEgc2ltcGxlIHdheSBvZiBzZWxlY3RpbmcgYW5kIHZpZXdpbmcgYnkgcHJvdmlkZXINCg0KYGBge3IgcHJvdmlkZXJzfQ0KDQojcHJvdmlkZXIuZGV0YWlscyBpcyBhIGxpc3Qgb2YgYWxsIHByb3ZpZGVycyB3aXRoIHRoZWlyIHZhcmlhdGlvbnMgYW5kIGFkZGl0aW9uYWwgaW5mbw0KIyBJdCBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCANCg0KIyBjaG9pY2VzIDwtc29ydChuYW1lcyhwcm92aWRlcnMuZGV0YWlscykpDQojIHNlbGVjdElucHV0KCJwcm92aWRlcnMiLCAiQ2hvb3NlIFByb3ZpZGVyIixjaG9pY2VzLCBzZWxlY3RlZD0iSEVSRSIpDQoNCiMgYmFzZSBtYXAgY2VudHJlZHdpdGggbGF0IGFuZCBsb24gb2YgemVybyBhbmQgYSB6b29tIGxldmVsIG9mIDINCm0gPC0gbGVhZmxldCgpICU+JSBzZXRWaWV3KDAsMCwyKSAgIyBub3RoaW5nIHNob3dpbmcgdW50aWwgd2Ugc2V0IHRpbGVkIGZyb20gdGhlIHByb3ZpZGVycw0KDQpjaG9pY2UgPC0gIkVzcmkiDQoNCiMgRXh0cmFjdCBFU1JJIHByb3ZpZGVkIHRpbGVzIC0gbGVhdmVzIHRoZSAxMSBlc3JpIG9uZXMgdGhlcmUNCmVzcmkgPC0gcHJvdmlkZXJzICU+JQ0KICBwdXJycjo6a2VlcCh+IGdyZXBsKCdeRXNyaScsLikpDQoNCg0KZXNyaSAlPiUNCiAgcHVycnI6OndhbGsoZnVuY3Rpb24oeCkgbSA8PC0gbSAlPiUgYWRkUHJvdmlkZXJUaWxlcyh4LGdyb3VwPXgpKQ0KDQoNCm0gJT4lDQogIGFkZExheWVyc0NvbnRyb2woDQogICAgYmFzZUdyb3VwcyA9IG5hbWVzKGVzcmkpLA0KICAgIG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhjb2xsYXBzZWQgPSBUUlVFKQ0KICApDQpgYGANCg0KI0xhYmVscw0KDQpUaGUgbGFiZWwgcGx1ZyBpbiBlbmFibGVzIG1hbnkgb3B0aW9ucyB0byBiZSBhcHBsaWVkLiBGb3Igb25jZSBhIHBlcnRpbmVudCB1c2Ugb2YgYSBuZXdiaWVzICJIZWxsbyB3b3JsZCIgZXhhbXBsZS5JbiB0aGlzIGNvZGUsIHRoZXJlIGFyZSBzZXZlcmFsIHZhcmlhYmxlcyB0aGF0IGNhbiBiZSBhbWVuZGVkIHRvIGNoYW5nZSB0aGVlIGxvb2sgb2YgdGhlIG91dHB1dA0KDQpgYGB7ciBsYWJlbH0NCg0KbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC0wLCBsYXQgPSA2MCwgem9vbSAgPSAyKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycygNCiAgbG5nID0gLTUwLA0KICBsYXQgPSA4MCwNCiAgZmlsbE9wYWNpdHkgPSAwLCAjMyByZWxvb2sgYXQNCiAgcmFkaXVzID0gMC4wMDAwMSwgIyMgcmVsb29rIGF0DQogIGxhYmVsID0gJ0hlbGxvIFdvcmxkJywNCiAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKA0KICBub0hpZGUgPSBULA0KICB0ZXh0c2l6ZSA9ICI2MHB4IiwNCiAgdGV4dE9ubHkgPSBULA0KICBzdHlsZSA9IGxpc3QoJ2NvbG9yJyA9ICdibHVlJywNCiAgJ2ZvbnQtZmFtaWx5JyA9ICdzZXJpZicpDQogICkNCiAgKQ0KICANCmBgYA0KDQpgYGB7ciBtQ0RvbmFsZHN9DQoNCg0KICANCmBgYA0KDQojIE1lYXN1cmVtZW50cw0KDQpPbmUgb2YgbXkgc29ucyBuZWVkcyB0byB0cmFpbiBmb3IgYSA0MDAgbWV0cmVzIHJhY2UgYnV0IGNhbid0IGJlIGJvdGhlcmVkIHRvIGdvIHRvIGEgbG9jYWwgdHJhY2suIEx1Y2tpbHkgd2UgaGF2ZSB0aGUgTHlubiBWYWxsZXkgUGFyayBuZWFyYnkuIFEuIFdpbGwgdGhpcyBzdWZmaWNlPyBBLlRyeSBvdXQgdGhlIGFkZF9tZWFzdXJlKCkgZnVuY3Rpb24NCg0KDQpgYGB7ciBkaXN0YW5jZXN9DQoNCmxlYWZsZXQoKSAlPiUNCiAgYWRkVGlsZXMoKSAlPiUgDQogIGZpdEJvdW5kcygtMTIzLjAzNSw0OS4zMzgsIC0xMjMuMDQwLDQ5LjM0MikgJT4lDQogIGFkZE1lYXN1cmUoDQogICAgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIsDQogICAgcHJpbWFyeUxlbmd0aFVuaXQgPSAibWV0ZXJzIiwNCiAgICBwcmltYXJ5QXJlYVVuaXQgPSAic3FtZXRlcnMiLA0KICAgIGFjdGl2ZUNvbG9yID0gIiMzRDUzNUQiLCANCiAgICBjb21wbGV0ZWRDb2xvciA9ICIjRkY3MDlDIiwNCiAgICBsb2NhbGl6YXRpb249J2VuJw0KICApDQoNCiAgDQpgYGANCg0KSSBqdXN0IGNsaWNrIG9uIHRoZSBvcHRpb25zIGluIGJvdHRvbS1sZWZ0IGFuZCBjYWxjdWxhdGUgZGlzdGFuY2UgDQoNCiFbXShpbWFnZXMvbHlublZhbGxleVBhcmsucG5nKQ0KDQpDbG9zZSBlbm91Z2ghDQoNCg0KDQpbTW9yZSBleGFtcGxlc10oaHR0cDovL3JwdWJzLmNvbS9iaGFza2FydmsvbGVhZmxldC1wcm92aWRlcnMpDQoNCg0KIyBPdGhlciBmdW5jdGlvbnMNCg0KVGhlcmUgYXJlIGEgZmV3IG1vcmUgY292ZXJlZCBpbiB0aGUgdmlnbmV0dGUgYW5kIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSBhbHNvIG1heSBoYXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gQ2hlY2sgdGhlbSBvdXQNCg0KIyBBdXRob3INCg0KW0FuZHJldyBDbGFya10oaHR0cDovL3d3dy50d2l0dGVyLmNvbS9wc3NndXkpIGlzIGFuIGluZGVwZW5kZW50IFIgZGV2ZWxvcGVyIGJhc2VkIGluIE5vcnRoIFZhbmNvdXZlciAgICANCg0KIEludHJvZHVjdGlvbnMgdG8gaGlzIHdvcmsgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBbbXl0aW55c2hpbnlzICB1bWJyZWxsYV0oaHR0cHM6Ly9teXRpbnlzaGlueXMuc2hpbnlhcHBzLmlvL2Rhc2hib2FyZC8pIGFuZCBhIHNldCBvZiByZWNlbnQgW2ZsZXhkYXNoYm9hcmRzXShodHRwczovL2JldGEucnN0dWRpb2Nvbm5lY3QuY29tL2FjbGFyay9mbGV4RGFzaEJvYXJkLyk=