我一直试图使用
webshot
包和
htmltools
中的
saveWidget
,虽然速度很慢。对于几百张地图来说,如果你只是偶尔需要使用,这可能还不错。但是,对于实时应用程序来说,它太慢了。
为此工作流程需要两个外部应用程序。
webshot
用于网页截图,需要您先安装PhantomJS(它很小且易于安装)。我还使用
ImageMagick(需要从命令行访问)创建
.gif
文件,但我相信有许多其他程序可以用来制作gif。
这个想法就是在循环中创建地图,用
saveWidget
将其保存到临时html文件中,并使用
webshot
将其转换为png(速度较慢)。然后,一旦您拥有所有的png文件,使用ImageMagick将它们转换为gif(速度快)。
以下是一个示例,我也加载了
ggmap
,但只是为了获取缩放位置。
library(webshot)
library(leaflet)
library(htmlwidgets)
library(ggmap)
loc <- geocode('mt everest')
zooms <- seq(2,14,3)
for (i in seq_along(zooms)) {
m <- leaflet(data=loc) %>%
addProviderTiles('Esri.WorldImagery') %>%
setView(lng=loc$lon, lat=loc$lat, zoom=zooms[i])
if (i==1)
m <- m %>% addPopups(popup="Going to see Mt Everest")
if (i==length(zooms))
m <- m %>%
addCircleMarkers(radius=90, opacity = 0.5) %>%
addPopups(popup = 'Mt Everest')
saveWidget(m, 'temp.html', selfcontained = FALSE)
webshot('temp.html', file=sprintf('Rplot%02d.png', i),
cliprect = 'viewport')
}
然后,只需要将png转换为gif。我在Windows上完成了此操作,因此在mac / linux上命令可能略有不同(我认为只需单引号而不是双引号之类的)。这些命令来自命令行/ shell,但您也可以使用system
/system2
从R中调用,或尝试具有一些ImageMagick包装器函数的animation
包。要制作一个简单的gif,只需使用convert *.png animation.gif
即可。我使用了稍微长一些的代码来缩小png文件/添加一些延迟/并使序列进入和退出。
convert Rplot%02d.png[1-5] -duplicate 1,-2-1, -resize "%50" gif:- | convert - -set delay "%[fx:(t==0||t==4)?240:40]" -quiet -layers OptimizePlus -loop 0 cycle.gif