rrmaps

r - add multiple markers to rMaps


Question

How do you add multiple markers using rMaps?

Data

coords <- structure(list(stop_id = 19841:19843, stop_name = c("Flagstaff Railway Station (Melbourne City)", 
"Melbourne Central Railway Station (Melbourne City)", "Parliament Railway Station (Melbourne City)"
), stop_lat = c(-37.8119813073807, -37.8099387667386, -37.8110540555305
), stop_lon = c(144.955653760429, 144.962593535096, 144.972910916416
)), .Names = c("stop_id", "stop_name", "stop_lat", "stop_lon"
), sorted = "stop_id", row.names = 17:19, class = c("data.table", 
"data.frame"))

Examples

Using library(rMaps) I can create a map and add a single marker, as per the examples on Ramnath's github page:

library(rMaps)

l <- Leaflet$new()
l$setView(c(-37.8602828, 145.079616), zoom=11)
l$tileLayer(provider = "Acetate.terrain")

## add one marker:
l$marker(LatLng = c(-37.81198,144.9557))

But I can't figure out how to add multiple markers from the coords data frame, without writing a l$marker line for each one.

I've tried to use GeoJSON but I'm new to this so haven't got my head around it yet and must be doing something wrong.

# library(rgdal)
# coords.sp <- SpatialPointsDataFrame(coords[,.(stop_lon, stop_lat)], coords[,.(stop_id, stop_name)])
# writeOGR(obj=coords.sp, dsn='coords.geojson', layer='OGRGeoJSON', driver='GeoJSON')

# gj <- readOGR("./coords.geojson", layer="OGRGeoJSON")
# l$geoJson(gj)
# l$geoJson("./coords.geojson")

I'm happy to use JSON/GeoJSON if it's the way to go.

Desired output

I would like the result to be the same as if I used library(leaflet) to show multiple markers

library(leaflet)
leaflet() %>%
  addProviderTiles("Acetate.terrain") %>%
  setView(lat = -37.8602828, lng = 145.079616, zoom=11) %>%
  addMarkers(data=coords, lat=~stop_lat, lng=~stop_lon)

marker_example

GeoJSON

Here is the GeoJSON code that's produced from the writeOGR command, and I've validated it at GeoJSONLint

{
"type": "FeatureCollection",

"features": [
{ "type": "Feature", "id": 1, "properties": { "stop_id": 19841, "stop_name": "Flagstaff Railway Station (Melbourne City)" }, "geometry": { "type": "Point", "coordinates": [ 144.955653760428987, -37.811981307380698 ] } },
{ "type": "Feature", "id": 2, "properties": { "stop_id": 19842, "stop_name": "Melbourne Central Railway Station (Melbourne City)" }, "geometry": { "type": "Point", "coordinates": [ 144.962593535096005, -37.809938766738597 ] } },
{ "type": "Feature", "id": 3, "properties": { "stop_id": 19843, "stop_name": "Parliament Railway Station (Melbourne City)" }, "geometry": { "type": "Point", "coordinates": [ 144.972910916415998, -37.811054055530498 ] } }
]}

Solution

  • I can make use of library(geojsonio) to correctly read the GeoJSON file, and then use l$geoJson to load the markers onto the map

    ## create spatial object and save as GeoJSON
    # library(rgdal)
    coords.sp <- SpatialPointsDataFrame(coords[,.(stop_lon, stop_lat)], coords[,.(stop_id, stop_name)])
    writeOGR(obj=coords.sp, dsn='coords.geojson', layer='OGRGeoJSON', driver='GeoJSON')
    
    l <- Leaflet$new()
    l$setView(c(-37.8602828, 145.079616), zoom=11)
    l$tileLayer(provider = "Acetate.terrain")
    
    ## Read the GeoJSON data
    library(geojsonio)
    gj <- geojson_read("./coords.geojson")
    l$geoJson(gj)
    

    markers plotted with geoJson