放大Leaflet地图后如何将其保存为PNG或PDF格式?
解决方案
问题出在你保存的始终是初始定义的地图对象,没有捕获用户操作后的地图视图参数(中心坐标、缩放级别)。Shiny会自动为Leaflet地图生成input$<mapId>_center和input$<mapId>_zoom这两个输入值,分别对应当前地图的中心经纬度和缩放级别,利用它们就能生成和当前视图一致的地图并保存。
修改后的完整代码如下:
library(shiny) library(leaflet) library(webshot2) library(htmlwidgets) library(mapview) ui <- fluidPage( titlePanel("Download Leaflet Map as PNG"), sidebarLayout( sidebarPanel( downloadButton("Download_map", "Download Map as PNG") ), mainPanel( leafletOutput("map") ) ) ) server <- function(input, output, session) { # 初始地图渲染 output$map <- renderLeaflet({ leaflet(options = leafletOptions(zoomControl = FALSE)) %>% addTiles() %>% setView(lng = -122.6765, lat = 45.5231, zoom = 12) %>% addMarkers(lng = -122.6765, lat = 45.5231, popup = "Portland, OR") }) output$Download_map <- downloadHandler( filename = "map.png", content = function(file) { # 获取当前地图的中心坐标和缩放级别 current_center <- input$map_center current_zoom <- input$map_zoom # 基于当前视图参数创建地图 current_map <- leaflet(options = leafletOptions(zoomControl = FALSE)) %>% addTiles() %>% setView(lng = current_center$lng, lat = current_center$lat, zoom = current_zoom) %>% addMarkers(lng = -122.6765, lat = 45.5231, popup = "Portland, OR") # 保存当前视图的地图 mapview::mapshot(current_map, file = file) } ) } shinyApp(ui = ui, server = server)
关键说明
input$map_center是一个列表,包含lng(经度)和lat(纬度)两个元素,对应当前地图的中心位置input$map_zoom是数值型变量,对应当前地图的缩放级别- 在下载时,我们不再使用初始的地图对象,而是根据实时获取的视图参数重新生成地图,这样保存的就是用户当前看到的视图
如果需要保存为PDF格式,只需修改filename为"map.pdf"即可,mapshot会自动识别文件格式。
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

