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

Author

Andrew Clark is an independent R developer based in North Vancouver

Introductions to his work can be found under the mytinyshinys umbrella and a set of recent flexdashboards

LS0tDQp0aXRsZTogImxlYWZsZXQgTm90ZWJvb2siDQphdXRob3I6ICJBbmRyZXcgQ2xhcmsiDQpkYXRlOiAic29tZWRheSBzb29uIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgIHRvYzogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoaXMgaXMgbXkgc2Vjb25kICBSIE5vdGVib29rIChmcm9tIFtSU3R1ZGlvXShodHRwczovL2Jsb2cucnN0dWRpby5vcmcvKSkgYW5kIHRlc3RzIHRoZSBtYXBwaW5nIFtsZWFmbGV0IHBhY2thZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9zZmlya2UvamFuaXRvcikgZGV2ZWxvcGVkIGJ5IFJTdHVkaW8gYnV0IGV4dGVuc2l2ZWx5IGNvbnRyaWJ1dGVkIHRvIGJ5IFtCaGFza2FyIEthcmFtYmVsa2FyXShodHRwczovL3R3aXR0ZXIuY29tL2JoYXNrYXJfdmspLiANCg0KQmhhc2thciBoYXMgW2Jsb2dnZWRdKGh0dHA6Ly93d3cua2FyYW1iZWxrYXIuaW5mby8yMDE2LzA5L2xlYWZsZXQtZGlhcnktcHJvbG9ndWUvKSBhYm91dCBwcm92aWRpbmcgYSBzZXQgb2YgcGx1Z2lucyB0byB0aGUgUiBwYWNrYWdlIGFuZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbGVhZmxldCBpbmNsdWRlcyBtYW55IG9mIHRoZXNlIA0KDQpUaGlzIG5vdGVib29rIHRha2VzIHNvbWUgb2YgdGhlIGV4YW1wbGVzIGZyb20gdGhlIHZpZ25ldHRlIGFuZCBkb2N1bWVudGF0aW9uIGJ1dCwgb2YgY291cnNlLCB0aGUgY29kZSBpcyBlYXNpbHkgYW1lbmRhYmxlIGFuZCBhbHRlcm5hdGl2ZSBkYXRhIGNhbiBiZSBzZWxlY3RlZCBmb3IgcHJvY2Vzc2luZy4gICAgDQoNCkp1c3Qgb3BlbiB1cCB0aGUgIC0gZG93bmxvYWRhYmxlIGZyb20gRHJvcGJveCAtIFtsZWFmbGV0Lm5iLmh0bWxdKGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzI1OTQ1NTk5L2phbml0b3IubmIuaHRtbD9kbD0xKSBpbiBSc3R1ZGlvIG9yIGluIHRoZSBSIGNvbnNvbGUgd2l0aCB0aGUgcm1hcmtkb3duIHBhY2thZ2UgYW5kIGFuIGVkaXRhYmxlIG5vdGVib29rIHZlcnNpb24gaXMgY3JlYXRlZCBmb3IgeW91IHRvIG1lc3MgYXJvdW5kIHdpdGguIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgdGhyZWUgbGlicmFyaWVzIGxpc3RlZCBiZWxvdyBpbnN0YWxsZWQgYW5kIGxvYWRlZA0KDQoNCg0KDQpgYGB7ciBsaWJyYXJpZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KHB1cnJyKQ0KIyBsaWJyYXJ5KHJlYWR4bCkNCiNsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShkcGx5cikgDQoNCmBgYA0KDQoNClRoZSBbcHVycnJdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYWRsZXkvcHVycnIpIHBhY2thZ2UgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgaGFuZGxpbmcgbGlzdHMgYW5kIGdvb2QNCmNvdmVyYWdlIGNhbiBiZSBmb3VuZCBpbiBpdCdzIGF1dGhvciwgSGFkbGV5IFdpY2toYW0ncywgW1IgZm9yIERhdGEgU2NpZW5jZV0oaHR0cDovL3I0ZHMuaGFkLmNvLm56LykgY28tYXV0aG9yZWQgd2l0aCBHYXJyZXR0IEdyb2xlbXVuZCBhbmQgSmVubnkgQnJ5YW4ncyBbdHV0b3JpYWxdKGh0dHBzOi8vamVubnliYy5naXRodWIuaW8vcHVycnItdHV0b3JpYWwvKQ0KDQojIERhdGFzZXQNCkhlcmUgaXMgdGhlIGZhbWlsaWFyIGRhdGFzZXQgdGhhdCBpcyB1c2VkIGluIHRoZSB2aWduZXR0ZS4gQWRkaW5nIHRoZSBwcmludCBzdGF0ZW1lbnQgcmVzdWx0cyBpbiBhIHRhYmxlICh3aGVuIGluIG5vdGVib29rIGZvcm1hdCkgd2l0aCB0aGUgb3B0aW9uIG9mIA0KdGhlIHRyYWRpdGlvbmFsIGxheW91dA0KDQoNCmBgYHtyIGRhdGF9DQoNCiNwcmludChnbGltcHNlKG10Y2FycykpDQoNCmBgYA0KDQojUHJvdmlkZXJzDQoNClRoZXJlIGFyZSBtb3JlIHRoYW4gMTAwIFtiYXNlIG1hcHMgYXZhaWxhYmxlXShodHRwczovL3QuY28vODJjeHk0WXo3SCkgZnJvbSAxOCBwcm92aWRlcnMuDQpIZXJlIGlzIGEgc2ltcGxlIHdheSBvZiBzZWxlY3RpbmcgYW5kIHZpZXdpbmcgYnkgcHJvdmlkZXINCg0KYGBge3IgcHJvdmlkZXJzfQ0KDQojcHJvdmlkZXIuZGV0YWlscyBpcyBhIGxpc3Qgb2YgYWxsIHByb3ZpZGVycyB3aXRoIHRoZWlyIHZhcmlhdGlvbnMgYW5kIGFkZGl0aW9uYWwgaW5mbw0KIyBJdCBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCANCg0KIyBjaG9pY2VzIDwtc29ydChuYW1lcyhwcm92aWRlcnMuZGV0YWlscykpDQojIHNlbGVjdElucHV0KCJwcm92aWRlcnMiLCAiQ2hvb3NlIFByb3ZpZGVyIixjaG9pY2VzLCBzZWxlY3RlZD0iSEVSRSIpDQoNCiMgYmFzZSBtYXAgY2VudHJlZHdpdGggbGF0IGFuZCBsb24gb2YgemVybyBhbmQgYSB6b29tIGxldmVsIG9mIDINCm0gPC0gbGVhZmxldCgpICU+JSBzZXRWaWV3KDAsMCwyKSAgIyBub3RoaW5nIHNob3dpbmcgdW50aWwgd2Ugc2V0IHRpbGVkIGZyb20gdGhlIHByb3ZpZGVycw0KDQpjaG9pY2UgPC0gIkVzcmkiDQoNCiMgRXh0cmFjdCBFU1JJIHByb3ZpZGVkIHRpbGVzIC0gbGVhdmVzIHRoZSAxMSBlc3JpIG9uZXMgdGhlcmUNCmVzcmkgPC0gcHJvdmlkZXJzICU+JQ0KICBwdXJycjo6a2VlcCh+IGdyZXBsKCdeRXNyaScsLikpDQoNCg0KZXNyaSAlPiUNCiAgcHVycnI6OndhbGsoZnVuY3Rpb24oeCkgbSA8PC0gbSAlPiUgYWRkUHJvdmlkZXJUaWxlcyh4LGdyb3VwPXgpKQ0KDQoNCm0gJT4lDQogIGFkZExheWVyc0NvbnRyb2woDQogICAgYmFzZUdyb3VwcyA9IG5hbWVzKGVzcmkpLA0KICAgIG9wdGlvbnMgPSBsYXllcnNDb250cm9sT3B0aW9ucyhjb2xsYXBzZWQgPSBUUlVFKQ0KICApDQpgYGANCg0KI0xhYmVscw0KDQpUaGUgbGFiZWwgcGx1ZyBpbiBlbmFibGVzIG1hbnkgb3B0aW9ucyB0byBiZSBhcHBsaWVkLiBGb3Igb25jZSBhIHBlcnRpbmVudCB1c2Ugb2YgYSBuZXdiaWVzICJIZWxsbyB3b3JsZCIgZXhhbXBsZS5JbiB0aGlzIGNvZGUsIHRoZXJlIGFyZSBzZXZlcmFsIHZhcmlhYmxlcyB0aGF0IGNhbiBiZSBhbWVuZGVkIHRvIGNoYW5nZSB0aGVlIGxvb2sgb2YgdGhlIG91dHB1dA0KDQpgYGB7ciBsYWJlbH0NCg0KbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC0wLCBsYXQgPSA2MCwgem9vbSAgPSAyKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycygNCiAgbG5nID0gLTUwLA0KICBsYXQgPSA4MCwNCiAgZmlsbE9wYWNpdHkgPSAwLCAjMyByZWxvb2sgYXQNCiAgcmFkaXVzID0gMC4wMDAwMSwgIyMgcmVsb29rIGF0DQogIGxhYmVsID0gJ0hlbGxvIFdvcmxkJywNCiAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKA0KICBub0hpZGUgPSBULA0KICB0ZXh0c2l6ZSA9ICI2MHB4IiwNCiAgdGV4dE9ubHkgPSBULA0KICBzdHlsZSA9IGxpc3QoJ2NvbG9yJyA9ICdibHVlJywNCiAgJ2ZvbnQtZmFtaWx5JyA9ICdzZXJpZicpDQogICkNCiAgKQ0KICANCmBgYA0KDQpgYGB7ciBtQ0RvbmFsZHN9DQoNCg0KICANCmBgYA0KDQojIE1lYXN1cmVtZW50cw0KDQpPbmUgb2YgbXkgc29ucyBuZWVkcyB0byB0cmFpbiBmb3IgYSA0MDAgbWV0cmVzIHJhY2UgYnV0IGNhbid0IGJlIGJvdGhlcmVkIHRvIGdvIHRvIGEgbG9jYWwgdHJhY2suIEx1Y2tpbHkgd2UgaGF2ZSB0aGUgTHlubiBWYWxsZXkgUGFyayBuZWFyYnkuIFEuIFdpbGwgdGhpcyBzdWZmaWNlPyBBLlRyeSBvdXQgdGhlIGFkZF9tZWFzdXJlKCkgZnVuY3Rpb24NCg0KDQpgYGB7ciBkaXN0YW5jZXN9DQoNCmxlYWZsZXQoKSAlPiUNCiAgYWRkVGlsZXMoKSAlPiUgDQogIGZpdEJvdW5kcygtMTIzLjAzNSw0OS4zMzgsIC0xMjMuMDQwLDQ5LjM0MikgJT4lDQogIGFkZE1lYXN1cmUoDQogICAgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIsDQogICAgcHJpbWFyeUxlbmd0aFVuaXQgPSAibWV0ZXJzIiwNCiAgICBwcmltYXJ5QXJlYVVuaXQgPSAic3FtZXRlcnMiLA0KICAgIGFjdGl2ZUNvbG9yID0gIiMzRDUzNUQiLCANCiAgICBjb21wbGV0ZWRDb2xvciA9ICIjRkY3MDlDIiwNCiAgICBsb2NhbGl6YXRpb249J2VuJw0KICApDQoNCiAgDQpgYGANCg0KSSBqdXN0IGNsaWNrIG9uIHRoZSBvcHRpb25zIGluIGJvdHRvbS1sZWZ0IGFuZCBjYWxjdWxhdGUgZGlzdGFuY2UgDQoNCiFbXShpbWFnZXMvbHlublZhbGxleVBhcmsucG5nKQ0KDQpDbG9zZSBlbm91Z2ghDQoNCg0KDQpbTW9yZSBleGFtcGxlc10oaHR0cDovL3JwdWJzLmNvbS9iaGFza2FydmsvbGVhZmxldC1wcm92aWRlcnMpDQoNCg0KIyBPdGhlciBmdW5jdGlvbnMNCg0KVGhlcmUgYXJlIGEgZmV3IG1vcmUgY292ZXJlZCBpbiB0aGUgdmlnbmV0dGUgYW5kIHNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSBhbHNvIG1heSBoYXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gQ2hlY2sgdGhlbSBvdXQNCg0KIyBBdXRob3INCg0KW0FuZHJldyBDbGFya10oaHR0cDovL3d3dy50d2l0dGVyLmNvbS9wc3NndXkpIGlzIGFuIGluZGVwZW5kZW50IFIgZGV2ZWxvcGVyIGJhc2VkIGluIE5vcnRoIFZhbmNvdXZlciAgICANCg0KIEludHJvZHVjdGlvbnMgdG8gaGlzIHdvcmsgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBbbXl0aW55c2hpbnlzICB1bWJyZWxsYV0oaHR0cHM6Ly9teXRpbnlzaGlueXMuc2hpbnlhcHBzLmlvL2Rhc2hib2FyZC8pIGFuZCBhIHNldCBvZiByZWNlbnQgW2ZsZXhkYXNoYm9hcmRzXShodHRwczovL2JldGEucnN0dWRpb2Nvbm5lY3QuY29tL2FjbGFyay9mbGV4RGFzaEJvYXJkLyk=