从R中的一系列Leaflet地图创建一个gif

我正在寻找一种自动方法将传单R Studio图转换为图像文件.

似乎将传单小部件导出为HTML很简单(Saving leaflet output as html).但是,我找不到任何关于如何将传单小部件生成的图像保存为图像的答案或文档.我可以在R Studio中手动执行此操作似乎很奇怪,但R Studio中没有一些函数可以调用来执行相同的操作.

我尝试了通常的嫌疑人,以下内容的变化:

png("test_png.png")
map
dev.off()

但这些只是打印白色或打印甚至无法打开的文件.如果我正确地理解了这个Git discussion,看起来像传单中的东西是不可用的,但是用户需要.

与此同时,R Studio显然有办法将这个图像渲染成图像文件,让我按一个按钮来完成它.有没有办法实现自动化?如何将R Studio中绘制的图像导出到图像文件?我需要图像文件,我需要这是程序化的,因为我想用几百张地图制作一个gif.

或者,我欢迎有关解决方法的建议.我可能会尝试这个:Python – render HTML content to GIF image但是如果有人有替代建议,请分享.

解决方法

我一直试图通过组合 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')  # zoom in everest
zooms <- seq(2,14,3)          # some zoom levels to animate

## Make the maps,this will make some pngs called 'Rplot%02d.png'
## in your current directory
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')

    ## This is the png creation part
    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的一些包装函数的动画包.要制作一个没有任何幻想的simle gif,只需转换* .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

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些