You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shiny IO部署后Leaflet地图下载功能失效问题求助

解决Shiny IO上Leaflet地图下载失效问题

本地运行时地图下载功能正常,但部署到Shiny IO后出现异常:Firefox会打开空白新标签页,Chrome则提示“错误 - 未知服务器错误”。

问题根源

  1. mapshot默认依赖的截图工具在Shiny IO环境中缺少必要的浏览器支持,无法正确渲染地图。
  2. cliprect = "viewport"参数依赖客户端浏览器的视口尺寸,服务器端无法获取该信息,导致截图失败。

解决方案

1. 更换截图引擎并显式指定尺寸

改用webshot2作为截图后端(Shiny IO已预装Chromium适配该包),同时显式设置地图截图的宽高,避免依赖客户端视口。

2. 修改后的完整代码

# 加载必要包
library(shiny)
library(leaflet)
library(mapview)
library(webshot2)

### UI
ui <- fluidPage(
  leafletOutput(outputId = "map"),
  downloadButton(outputId = "dl")
)

### Server
server <- function(input, output, session) {
  
  # 创建基础Leaflet地图(响应式)
  foundational.map <- reactive({
    leaflet() %>%
      setView(13.39883565902603, 52.532396478732, zoom = 11) %>%
      addProviderTiles("CartoDB.Positron", group="Greyscale")
  })
  
  # 渲染基础地图
  output$map <- leaflet::renderLeaflet({
    foundational.map()
  })
  
  # 保存用户调整后的地图(响应式)
  user.created.map <- reactive({
    foundational.map() %>%
      setView(lng = input$map_center$lng,
              lat = input$map_center$lat,
              zoom = input$map_zoom)
  })
  
  # 下载处理
  output$dl <- downloadHandler(
    filename = function() {
      paste0(Sys.Date(), "_customLeafletmap.png")
    },
    content = function(file) {
      mapshot(
        x = user.created.map(),
        file = file,
        vwidth = 800,  # 显式设置截图宽度
        vheight = 600, # 显式设置截图高度
        zoom = 2       # 提升截图清晰度,可按需调整
      )
    }
  )
  
}

# 运行应用
shinyApp(ui = ui, server = server)

3. 部署注意事项

  • 确保部署包列表中包含webshot2,可以在app.R开头添加包加载语句,或在renv环境中锁定依赖。
  • Shiny IO默认已配置Chromium环境,无需手动安装浏览器,若仍有问题可尝试添加webshot2::install_chromium()(通常不需要)。

内容的提问来源于stack exchange,提问作者Karl Müller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:01:32