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

如何在Shiny中基于Positron底图实现双SpatRaster并排展示?

问题描述

在Shiny应用中使用leaflet的addSidebyside()函数并排展示两个SpatRaster时,默认底图下功能正常,但切换为CartoDB.Positron等第三方底图后,栅格图像不再显示。如何实现基于Positron底图的双栅格并排叠加展示?

问题原因

核心问题是图层 pane 的层级(zIndex)和底图的分配逻辑错误:

  • 第三方底图默认加载在默认pane,其zIndex高于自定义的right/left pane,导致栅格被完全遮挡
  • 原有代码中第三方底图没有绑定到对应的左右pane,和栅格的pane层级冲突
解决方法
  1. 提高自定义pane的zIndex值(设为400,高于第三方底图默认的zIndex)
  2. 将第三方底图分别添加到right和left两个pane,替代原有的addTiles(),保证左右分栏的底图与栅格一一对应
  3. 保持栅格图层的pane设置与对应底图一致,确保层级正确
修正后的完整代码
library(shiny)
library(leaflet)
library(terra)
library(leaflet.extras)
library(leaflet.extras2)

ui <- fluidPage(
  leafletOutput("leafmap")
)
server <- function(input, output){

  nrow <- 499
  ncol <- 469
  nlyr <- 1
  resolution_x <- 0.002245788
  resolution_y <- 0.002245788
  xmin <- 16.93303
  xmax <- 17.9863
  ymin <- 47.75883
  ymax <- 48.87948
  
  # 创建SpatRaster对象
  r1 <- rast(nrows = nrow, ncols = ncol, nlyrs = nlyr,
            resolution = c(resolution_x, resolution_y),
            ext = ext(xmin, xmax, ymin, ymax),
            crs = "EPSG:4326")
  
  values(r1)<-matrix(runif(nrow * ncol, min = 0, max = 1), 
                     nrow = nrow, ncol = ncol)
  
  r2 <- rast(nrows = nrow, ncols = ncol, nlyrs = nlyr,
             resolution = c(resolution_x, resolution_y),
             ext = ext(xmin, xmax, ymin, ymax),
             crs = "EPSG:4326")
  values(r2)<-matrix(runif(nrow * ncol, min = 0, max = 1), 
                     nrow = nrow, ncol = ncol)

  
  bins <- c(0.25, 0.35, 0.5, 0.75, 1)
  colors <- c("#0000FF", "#00FFFF", "#FFFFFF", "#FF7F7F", "#FF0000")
  bins_cv<-c(0.25,0.5,0.75,1)
  colors_cv <- c("#00b344",
                 "#6ecc66", 
                 "#a7e58c", 
                 "#d9ffb7"
  )
  
  
  labels <- c("","Low", "Moderate", "High", "Very High")
  labels_cv <- c("High","Intermediate","Moderate", "Low")
  color_palette <- colorBin(palette = colors, domain = values(r1), bins = bins, na.color = "transparent")
  color_palette_cv <- colorBin(palette = colors_cv, domain = values(r1), bins = bins_cv, na.color = "transparent")
  
  output$leafmap<-renderLeaflet(
    leaflet() %>% 
      # 创建左右pane并设置更高的zIndex
      addMapPane("right", zIndex = 400) %>% 
      addMapPane("left",  zIndex = 400) %>% 
      
      # 将Positron底图分别添加到左右pane,设置对应layerId
      addProviderTiles(providers$CartoDB.Positron, group = "Positron", 
                       layerId = "baseid1", options = pathOptions(pane = "right")) %>%
      addProviderTiles(providers$CartoDB.Positron, group = "Positron", 
                       layerId = "baseid2", options = pathOptions(pane = "left")) %>% 

      # 栅格绑定到对应pane
      addRasterImage(x = r1,colors = color_palette_cv, opacity = 0.8, 
                     options = pathOptions(pane = "right"), group = "Random raster 1") %>% 
      addRasterImage(x = r2, colors = color_palette, opacity = 0.6, 
                     options = pathOptions(pane = "left"), group = "Random raster 2") %>% 
 
      addSidebyside(layerId = "sidecontrols",
                    rightId = "baseid1",
                    leftId  = "baseid2") %>%
      addLegend(colors = colors_cv,bins = bins,labels = labels_cv, values = values(r1), title = "R1",
                position = "bottomright", group = "Raster 1") %>%
      addLegend(colors = colors, bins = bins, labels = labels, values = values(r2), title = "R2",
                position = "bottomleft", group = "Raster 2")
    
  )
}
shinyApp(ui = ui, server = server)

说明:修改点在于调整了addMapPane的zIndex,同时将第三方底图分别添加到左右两个pane,替代了原来的默认addTiles(),确保底图和栅格都在对应的分栏pane中,层级不会冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:27:06