Until version 1.3.0 RgoogleMaps only downloaded static maps as provided by the static maps APIs from e.g. Google, bing and OSM. While there are numerous advantages to this strategy such as full access to the extensive feature list provided by those APIs, the limitations are also clear:
Beginning with version 1.4.1 (which is now on CRAN ) , we added the functions GetMapTiles and PlotOnMapTiles which fetch individual map tiles and store them locally.
For example, if we wanted to fetch 20 tiles (in each direction) at zoom level 16 around Washington Square Park in Manhattan, we would simply run
library(RgoogleMaps)
(center=getGeoCode("Washington Square Park;NY"))
## lat lon
## 40.73082 -73.99733
GetMapTiles(center, zoom=16,nTiles = c(20,20))
Note that the default server is taken to be openstreetmap and the default local directory \(tileDir= "~/mapTiles/OSM/"\). We could have also passed the location string directly and saved several zoom levels at once (note the constant radius adaptation of the number of tiles):
for (zoom in 13:15)
GetMapTiles("Washington Square Park;NY", zoom=zoom,nTiles = round(c(20,20)/(17-zoom)))
Before requesting new tiles, the function checks if that map tile exists already which avoids redundant downloads.
We can repeat the process with Google map tiles and plot them:
for (zoom in 13:16)
GetMapTiles("Washington Square Park;NY", zoom=zoom,nTiles = round(c(20,20)/(17-zoom)),
urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir= "~/mapTiles/Google/")
#just get 3x3 tiles:
#mt= GetMapTiles(center = c(lat = 40.73082, lon =-73.99733), zoom=16,nTiles = c(3,3), urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir= "~/mapTiles/Google/", returnTiles = TRUE)
mt= GetMapTiles("Washington Square Park;NY", zoom=16,nTiles = c(3,3),
urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir= "~/mapTiles/Google/", returnTiles = TRUE)
PlotOnMapTiles(mt)
tmp2=GetMapTiles("Washington Square Park;NY", zoom=16,nTiles = c(3,3), verbose=0,
urlBase = "http://tile.stamen.com/toner/",
tileDir= "~/mapTiles/stamenToner/")
par(pty="s")
PlotOnMapTiles(tmp2)
While the original motivation of GetMapTiles was to enable offline creation of static maps within the package RgoogleMaps, combining this feature with the interactivity of the leaflet library leads to an effective offline maps version of leaflet!
We only need to replace the default server specified by the parameter urlTemplate by a local server obliging with the file naming scheme zoom_X_Y.png set by GetMapTiles Any simple local Web service will suffice, but the following two solutions work best for me
So assuming (i) successful execution of the map tileabove and (ii) the correct launch of the server (in the parent dirtectory of mapTiles/), the following code will have leaflet dynamically load them (from the local repository) for zooming and panning abilities:
library(leaflet)
m = leaflet::leaflet() %>%
addTiles( urlTemplate = "http:/localhost:8000/mapTiles/OSM/{z}_{x}_{y}.png")
m = m %>% leaflet::setView(-73.99733, 40.73082 , zoom = 16)
m = m %>% leaflet::addMarkers(-73.99733, 40.73082 )
m
And for google map tiles:
library(leaflet)
m = leaflet::leaflet() %>%
addTiles( urlTemplate = "http:/localhost:8000/mapTiles/Google/{z}_{x}_{y}.png")
m = m %>% leaflet::setView(-73.99733, 40.73082 , zoom = 16)
m = m %>% leaflet::addMarkers(-73.99733, 40.73082 )
m
And for stamen map tiles:
library(leaflet)
m = leaflet::leaflet() %>%
addTiles( urlTemplate = "http:/localhost:8000/mapTiles/stamenToner/{z}/{x}/{y}.png")
m = m %>% leaflet::setView(-73.99733, 40.73082 , zoom = 16)
m = m %>% leaflet::addMarkers(-73.99733, 40.73082 )
m
As Tableau also allows the Customization of map backgrounds (see e.g. https://blog.hwr-berlin.de/codeandstats/customizing-map-background-in-tableau/) we can apply the same offline server trick as above in order to use a local map tile server in Tableau!