Ubuntu 22.04下如何成功将Leaflet地图保存为PNG格式图片
问题根源
libproviders.so加载报错、导出空白PNG的核心原因是PhantomJS已停止维护超过6年,完全不兼容Ubuntu 22.04默认搭载的OpenSSL 3.0系统库。目前能找到的PhantomJS 2.1.1、1.9.8均为2018年之前发布的旧版本,不存在适配Ubuntu 22.04的可用开发版,无需在PhantomJS安装、版本切换上继续耗费时间。
以下两个方案均可保留你需要的CartoDB暗色底图效果,全程不依赖Google服务,可直接导出符合要求的PNG文件。
方案1:保留现有Leaflet代码,替换截图工具(改动量最小)
将依赖PhantomJS的webshot包替换为基于Chromium无头渲染的webshot2包即可,现有Leaflet绘图逻辑无需任何修改,不会出现兼容报错、底图加载不全、导出空白的问题。
- 先安装系统层依赖:
sudo apt update && sudo apt install -y chromium-browser
- 在R环境中安装webshot2:
install.packages("webshot2")
- 替换原有导出逻辑,其余代码保持原样:
library(leaflet); library(htmlwidgets); library(webshot2) # 原有Leaflet绘图代码无需改动 m <- leaflet() %>% addTiles("https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png") %>% setView(-.12, 51.50, zoom=13) m$x$options <- append(m$x$options, list("zoomControl" = FALSE)) m <- m %>% addCircleMarkers(c(-.11, -.12, -.13), c(51.48, 51.52, 51.50), radius=1, color="red") # 替换原有的webshot调用 saveWidget(m, "temp.html", selfcontained = TRUE) webshot2("temp.html", file = "Rplot.png", cliprect = "viewport", delay = 2)
该方案导出的渲染效果和Leaflet交互预览效果完全一致,delay=2参数是给底图瓦片预留加载时间,避免出现底图缺失。
方案2:原生静态地图绘制(稳定性最高,无浏览器依赖)
如果不需要保留HTML交互能力,可以直接用R的静态绘图体系实现完全相同的视觉效果,全程不涉及HTML渲染、无头浏览器类依赖,不会出现动态资源加载超时导致的空白问题,底图和你当前使用的CartoDB暗色底图完全同源。
实现代码如下,依赖ggplot2、ggspatial、sf三个包:
# 安装所需依赖 install.packages(c("ggplot2", "ggspatial", "sf")) library(ggplot2) library(ggspatial) library(sf) # 整理点位数据 point_df <- data.frame( lon = c(-.11, -.12, -.13), lat = c(51.48, 51.52, 51.50) ) %>% st_as_sf(coords = c("lon", "lat"), crs = 4326) # 绘制地图 ggplot() + # 加载同源CartoDB暗色底图 annotation_map_tile(type = "cartodark", zoom = 13) + # 添加红色标记点 geom_sf(data = point_df, color = "red", size = 1) + # 匹配原有地图显示范围 coord_sf(xlim = c(-0.135, -0.105), ylim = c(51.475, 51.525)) + # 隐藏冗余坐标轴、控件,保持简洁效果 theme_void() # 直接导出PNG,可自定义分辨率、尺寸 ggsave("Rplot.png", width = 8, height = 6, dpi = 300)
该方案导出速度更快,结果可复现性更强,适合学术绘图场景。
补充说明
两个方案使用的均为CartoDB官方提供的暗色底图,深色视觉效果完全适配夜间犯罪研究的展示主题,未调用任何Google服务接口。
内容的提问来源于stack exchange,提问作者jay.sf
相关产品推荐
相关产品推荐

