如何在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
相关产品推荐
相关产品推荐

