R语言调用mapshot()保存mapview PNG时数据图层不显示
问题根源
mapshot()导出静态PNG时默认等待渲染的延迟时间过短:底图瓦片资源加载优先级高、速度快,而矢量数据图层加载渲染存在延迟,触发截图动作时点位图层尚未完成绘制,最终导出的文件就只会保留先加载完成的底图。- 直接传入普通数据框生成地图存在兼容问题:当前代码直接传入带经纬度字段的普通data.frame,依赖
mapview()内部临时做空间格式转换,这个临时生成的图层在静态截图渲染流程中存在图层丢失的已知问题;RStudio查看器是实时交互渲染、手动导出是等所有资源加载完成后再触发截图,因此这两个场景下不会出现丢层,导出HTML时是全量资源打包不存在渲染时机问题,因此HTML导出正常。
修复方法
- 提前将普通数据框转换为标准sf空间点对象,不依赖mapview内部的临时转换逻辑
- 调大
mapshot()的延迟等待参数,给足图层加载渲染的时间
可直接运行的修复代码:
library(sf) # 转换为WGS84坐标系的标准sf点对象 edinburgh_sites_sf <- st_as_sf( edinburgh_sites, coords = c("longitude", "latitude"), crs = 4326 ) # 基于sf对象生成地图 edinburgh_sites_map <- mapview(edinburgh_sites_sf, grid = FALSE) # 导出PNG时增加渲染等待时长,单位为秒,网络环境差时可适当调大 mapshot( edinburgh_sites_map, file = paste0(getwd(), "/Figures/edin_sites_map.png"), delay = 5 )
补充排查项
如果以上调整后仍存在丢层问题,可尝试:
- 升级
mapview、webshot2包到最新版本,优先使用webshot2替代默认的webshot,无头浏览器渲染稳定性更高 - 导出时暂时移除非必要的地图控件,避免控件渲染阻塞图层加载:在
mapshot()参数中增加remove_controls = c("zoomControl", "homeButton", "scaleBar", "layersControl")
内容的提问来源于stack exchange,提问作者Alwayslearning
相关产品推荐
相关产品推荐

