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

如何在R Shiny应用中离线使用Plotly Mapboxes?

离线使用Plotly Mapbox的R Shiny解决方案

核心结论

可以离线使用Plotly Mapbox,且你已下载的瓦片集在转换为标准切片格式后可直接复用,以下是具体实现步骤:


1. 适配已有瓦片集(转为标准Mapbox切片格式)

如果你的Stamen瓦片是通过ggmap::get_stamenmap()下载的单张图片,需要先转换为Mapbox要求的z/x/y层级式切片结构(按缩放层级、横向/纵向索引命名的瓦片文件):

  • 推荐用maptiles包直接下载符合要求的标准切片(可复用你之前ggmap的地理范围参数):
    library(maptiles)
    # 定义地图范围(替换为你实际使用的边界)
    bbox <- c(left = -180, bottom = -90, right = 180, top = 90)
    # 下载Stamen瓦片到本地目录,指定所需缩放层级
    get_tiles(bbox, provider = "Stamen.Terrain", zoom = 3:8, 
              destdir = "local_tiles", cachedir = "local_tiles_cache")
    
  • 若要复用已有的单张地图图片,可使用mapbox-tile-copy等工具将大图分割为标准切片格式。

2. 搭建本地静态瓦片服务

Plotly Mapbox需通过URL访问瓦片,因此要在本地启动一个静态文件服务器:

library(servr)
# 指向存放切片瓦片的目录,启动本地服务(端口可自定义)
servr::httd("local_tiles", port = 8000)

3. 在Shiny中配置离线Plotly Mapbox

3.1 配置本地瓦片图层

在Plotly布局中指定使用本地瓦片,替代默认在线地图样式:

library(plotly)
library(shiny)

ui <- fluidPage(
  plotlyOutput("map")
)

server <- function(input, output) {
  output$map <- renderPlotly({
    # 示例线路数据(替换为你的实际线路数据)
    line_data <- data.frame(
      lat = c(30, 40, 50),
      lon = c(-100, -90, -80)
    )
    
    plot_ly(data = line_data) %>%
      add_scattermapbox(
        lat = ~lat,
        lon = ~lon,
        mode = "lines",
        line = list(width = 2, color = "#2c3e50")
      ) %>%
      layout(
        mapbox = list(
          style = "white-bg", # 禁用在线默认样式
          layers = list(
            list(
              sourcetype = "raster",
              source = "http://localhost:8000/{z}/{x}/{y}.png", # 本地瓦片访问地址
              below = "traces" # 将瓦片置于线路图层下方
            )
          ),
          zoom = 3,
          center = list(lat = 0, lon = 0)
        )
      )
  })
}

shinyApp(ui, server)

3.2 本地化Plotly前端资源

为避免Shiny在线加载Plotly的JS/CSS资源,需提前将依赖包下载到本地:

library(htmlwidgets)
# 生成示例Plotly图表,导出前端依赖资源
temp_plot <- plot_ly() %>% add_scattermapbox(lat = 0, lon = 0)
saveWidget(temp_plot, "plotly_offline.html", selfcontained = FALSE)

将生成的plotly_offline_files文件夹复制到Shiny应用的www目录下,然后在UI中添加本地资源引用:

ui <- fluidPage(
  tags$head(
    tags$script(src = "plotly_offline_files/plotly-latest.min.js"),
    tags$link(rel = "stylesheet", href = "plotly_offline_files/plotly.css")
  ),
  plotlyOutput("map")
)

内容的提问来源于stack exchange,提问作者David Robie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:17:36