Leaflet is a R package which allows to produce interactive maps (you can find information here). We can obtain a background map with

library(leaflet)
m <- leaflet()
m <- addTiles(m)
m

It is possible to use the pipe operator of dplyr

library(tidyverse)
leaflet()%>%addTiles()

Many formats of background maps are available (some examples here). For instance

Paris <- c(2.35222,48.856614)
m2 <- leaflet() %>% setView(lng = Paris[1], lat = Paris[2], zoom = 12) %>% addTiles(urlTemplate = "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
m2 %>% addProviderTiles("Stamen.Toner")
m2 %>% addProviderTiles("Stamen.Toner")
m2%>% addProviderTiles("OpenStreetMap.BlackAndWhite")
m2%>% addProviderTiles("Thunderforest.Transport")

addMarkers or addCircles can be used to add markers:

data(quakes)
leaflet(data = quakes[1:20,]) %>% addTiles(urlTemplate = "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") %>%
  addMarkers(~long, ~lat, popup = ~as.character(mag))

Observe that we have to use the tilda character ~ when we want to use the names of the dataframe to obtain the map.

Popups can add informations:

content <- paste(sep = "<br/>",
  "<b><a href='http://www.samurainoodle.com'>Samurai Noodle</a></b>",
  "606 5th Ave. S",
  "Seattle, WA 98138"
)

leaflet() %>% addTiles(urlTemplate = "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") %>%
  addPopups(-122.327298, 47.597131, content,
    options = popupOptions(closeButton = FALSE)
  )

Exercise 1

Put a popup which allows to localize Edhec Business School. Add on this popup the website of the school. You can obtain longitude and latitude of Edhec at the following url

Exercise 2: city bike - Paris

  1. Import this dataset

  2. Explain the variables

  3. Suppress lines without longitude and latitude.

  4. Describe the variable geo

  5. Create one variable lon for the longitude of the station a one variable lat for the latitude.

  6. Represent the stations on a leaflet background map.

  7. Add a popup which indicates the number of available bikes (electric+mecanic) when we click on the station (you can use the popup option in the function addCircleMarkers). You fist have to define a variable numBikesAvailable which corresponds to the sum of Nombre.de.vélo.mécanique and Nombre.vélo.électrique.

  8. Add the name (Nom.de.la.station) of the station in the popup.

  9. Make points of different sizes in terms of the proportion of available bikes (= numBikesAvailable/ Nombres.de.bornes.en.station).

LS0tCnRpdGxlOiAiTWFwcGluZyB3aXRoIGxlYWZsZXQiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKIyAgICB0b2M6IHRydWUKIyAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoKCkxlYWZsZXQgaXMgYSBSIHBhY2thZ2Ugd2hpY2ggYWxsb3dzIHRvIHByb2R1Y2UgaW50ZXJhY3RpdmUgbWFwcyAoeW91IGNhbiBmaW5kIGluZm9ybWF0aW9uIFtoZXJlXShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2xlYWZsZXQvKSkuIFdlIGNhbiBvYnRhaW4gYSBiYWNrZ3JvdW5kIG1hcCB3aXRoCgpgYGB7cn0KbGlicmFyeShsZWFmbGV0KQptIDwtIGxlYWZsZXQoKQptIDwtIGFkZFRpbGVzKG0pCm0KYGBgCgpJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIHBpcGUgb3BlcmF0b3Igb2YgKmRwbHlyKgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGVhZmxldCgpJT4lYWRkVGlsZXMoKQpgYGAKCk1hbnkgZm9ybWF0cyBvZiBiYWNrZ3JvdW5kIG1hcHMgYXJlIGF2YWlsYWJsZSAoc29tZSBleGFtcGxlcyBbaGVyZV0oaHR0cDovL2xlYWZsZXQtZXh0cmFzLmdpdGh1Yi5pby9sZWFmbGV0LXByb3ZpZGVycy9wcmV2aWV3LykpLiBGb3IgaW5zdGFuY2UKCmBgYHtyfQpQYXJpcyA8LSBjKDIuMzUyMjIsNDguODU2NjE0KQptMiA8LSBsZWFmbGV0KCkgJT4lIHNldFZpZXcobG5nID0gUGFyaXNbMV0sIGxhdCA9IFBhcmlzWzJdLCB6b29tID0gMTIpICU+JSBhZGRUaWxlcyh1cmxUZW1wbGF0ZSA9ICJodHRwOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nIikKbTIgJT4lIGFkZFByb3ZpZGVyVGlsZXMoIlN0YW1lbi5Ub25lciIpCm0yICU+JSBhZGRQcm92aWRlclRpbGVzKCJTdGFtZW4uVG9uZXIiKQptMiU+JSBhZGRQcm92aWRlclRpbGVzKCJPcGVuU3RyZWV0TWFwLkJsYWNrQW5kV2hpdGUiKQptMiU+JSBhZGRQcm92aWRlclRpbGVzKCJUaHVuZGVyZm9yZXN0LlRyYW5zcG9ydCIpCmBgYAoKKiphZGRNYXJrZXJzKiogb3IgKiphZGRDaXJjbGVzKiogY2FuIGJlIHVzZWQgdG8gYWRkIG1hcmtlcnM6CmBgYHtyfQpkYXRhKHF1YWtlcykKbGVhZmxldChkYXRhID0gcXVha2VzWzE6MjAsXSkgJT4lIGFkZFRpbGVzKHVybFRlbXBsYXRlID0gImh0dHA6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciKSAlPiUKICBhZGRNYXJrZXJzKH5sb25nLCB+bGF0LCBwb3B1cCA9IH5hcy5jaGFyYWN0ZXIobWFnKSkKYGBgCgpPYnNlcnZlIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIHRpbGRhIGNoYXJhY3RlciAqKn4qKiB3aGVuIHdlIHdhbnQgdG8gdXNlIHRoZSBuYW1lcyBvZiB0aGUgZGF0YWZyYW1lIHRvIG9idGFpbiB0aGUgbWFwLiAKClBvcHVwcyBjYW4gYWRkIGluZm9ybWF0aW9uczoKCmBgYHtyfQpjb250ZW50IDwtIHBhc3RlKHNlcCA9ICI8YnIvPiIsCiAgIjxiPjxhIGhyZWY9J2h0dHA6Ly93d3cuc2FtdXJhaW5vb2RsZS5jb20nPlNhbXVyYWkgTm9vZGxlPC9hPjwvYj4iLAogICI2MDYgNXRoIEF2ZS4gUyIsCiAgIlNlYXR0bGUsIFdBIDk4MTM4IgopCgpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKHVybFRlbXBsYXRlID0gImh0dHA6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmciKSAlPiUKICBhZGRQb3B1cHMoLTEyMi4zMjcyOTgsIDQ3LjU5NzEzMSwgY29udGVudCwKICAgIG9wdGlvbnMgPSBwb3B1cE9wdGlvbnMoY2xvc2VCdXR0b24gPSBGQUxTRSkKICApCmBgYAoKCiMjIyBFeGVyY2lzZSAxCgpQdXQgYSBwb3B1cCB3aGljaCBhbGxvd3MgdG8gbG9jYWxpemUgKipFZGhlYyBCdXNpbmVzcyBTY2hvb2wqKi4gQWRkIG9uIHRoaXMgcG9wdXAgdGhlIHdlYnNpdGUgb2YgdGhlIHNjaG9vbC4gWW91IGNhbiBvYnRhaW4gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBvZiBFZGhlYyBhdCB0aGUgZm9sbG93aW5nIFt1cmxdKGh0dHBzOi8vd3d3LmNvb3Jkb25uZWVzLWdwcy5mcikKCgoKIyMjIEV4ZXJjaXNlIDI6IGNpdHkgYmlrZSAtIFBhcmlzCgoxLiBJbXBvcnQgdGhpcyBbZGF0YXNldF0oaHR0cHM6Ly9vcGVuZGF0YS5wYXJpcy5mci9leHBsb3JlL2RhdGFzZXQvdmVsaWItZGlzcG9uaWJpbGl0ZS1lbi10ZW1wcy1yZWVsL2V4cG9ydC8pCgoKMi4gRXhwbGFpbiB0aGUgdmFyaWFibGVzCgozLiBTdXBwcmVzcyBsaW5lcyB3aXRob3V0IGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUuCgo0LiBEZXNjcmliZSB0aGUgdmFyaWFibGUgKipnZW8qKgoKNS4gQ3JlYXRlIG9uZSB2YXJpYWJsZSAqKmxvbioqIGZvciB0aGUgbG9uZ2l0dWRlIG9mIHRoZSBzdGF0aW9uIGEgb25lIHZhcmlhYmxlICoqbGF0KiogZm9yIHRoZSBsYXRpdHVkZS4KCjYuIFJlcHJlc2VudCB0aGUgc3RhdGlvbnMgb24gYSBsZWFmbGV0IGJhY2tncm91bmQgbWFwLgoKNy4gQWRkIGEgcG9wdXAgd2hpY2ggaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpa2VzIChlbGVjdHJpYyttZWNhbmljKSB3aGVuIHdlIGNsaWNrIG9uIHRoZSBzdGF0aW9uICh5b3UgY2FuIHVzZSB0aGUgKipwb3B1cCoqIG9wdGlvbiBpbiB0aGUgZnVuY3Rpb24gKiphZGRDaXJjbGVNYXJrZXJzKiopLiBZb3UgZmlzdCBoYXZlIHRvIGRlZmluZSBhIHZhcmlhYmxlICoqbnVtQmlrZXNBdmFpbGFibGUqKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgc3VtIG9mICoqTm9tYnJlLmRlLnbDqWxvLm3DqWNhbmlxdWUqKiBhbmQgKipOb21icmUudsOpbG8uw6lsZWN0cmlxdWUqKi4KCjguIEFkZCB0aGUgbmFtZSAoKipOb20uZGUubGEuc3RhdGlvbioqKSBvZiB0aGUgc3RhdGlvbiBpbiB0aGUgcG9wdXAuCgo5LiBNYWtlIHBvaW50cyBvZiBkaWZmZXJlbnQgc2l6ZXMgaW4gdGVybXMgb2YgdGhlIHByb3BvcnRpb24gb2YgYXZhaWxhYmxlIGJpa2VzICgqKj0gbnVtQmlrZXNBdmFpbGFibGUvIE5vbWJyZXMuZGUuYm9ybmVzLmVuLnN0YXRpb24qKikuCg==