如何在Shiny中基于Positron底图实现双SpatRaster并排展示?
问题描述
在Shiny应用中使用leaflet的addSidebyside()函数并排展示两个SpatRaster时,默认底图下功能正常,但切换为CartoDB.Positron等第三方底图后,栅格图像不再显示。如何实现基于Positron底图的双栅格并排叠加展示?
问题原因
核心问题是图层 pane 的层级(zIndex)和底图的分配逻辑错误:
- 第三方底图默认加载在默认pane,其zIndex高于自定义的
right/leftpane,导致栅格被完全遮挡 - 原有代码中第三方底图没有绑定到对应的左右pane,和栅格的pane层级冲突
解决方法
- 提高自定义pane的zIndex值(设为400,高于第三方底图默认的zIndex)
- 将第三方底图分别添加到
right和left两个pane,替代原有的addTiles(),保证左右分栏的底图与栅格一一对应 - 保持栅格图层的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
相关产品推荐
相关产品推荐

