简体   繁体   English

leaflet 并排用于 R 中的 2 个光栅图像

[英]leaflet side-by-side for 2 raster images in R

{leaflet.extras2} implements the leaflet side-by-side plugin and provides this minimal example: {leaflet.extras2}实现了 leaflet并排插件并提供了这个最小示例:

library(leaflet)
library(leaflet.extras2)

leaflet(quakes) %>%
  addMapPane("left", zIndex = 0) %>%
  addMapPane("right", zIndex = 0) %>%
  addTiles(group = "base", layerId = "baseid",
           options = pathOptions(pane = "right")) %>%
  addProviderTiles(providers$CartoDB.DarkMatter, group="carto", layerId = "cartoid",
                   options = pathOptions(pane = "left")) %>%
  addCircleMarkers(data = breweries91[1:15,], color = "blue", group = "blue",
                   options = pathOptions(pane = "left")) %>%
  addCircleMarkers(data = breweries91[15:20,], color = "yellow", group = "yellow") %>%
  addCircleMarkers(data = breweries91[15:30,], color = "red", group = "red",
                   options = pathOptions(pane = "right")) %>%
  addLayersControl(overlayGroups = c("blue","red", "yellow")) %>%
  addSidebyside(layerId = "sidecontrols",
                rightId = "baseid",
                leftId = "cartoid")

在此处输入图像描述

However, when adapting to two raster images, I encounter the error:但是,在适应两个raster图像时,我遇到了错误:

Error in addRasterImage(., r2, colors = pal2, options = pathOptions(pane = "right"),  : 
  unused argument (options = pathOptions(pane = "right"))

Here is a reproducible example:这是一个可重现的示例:

library(raster)
library(leaflet)
library(leaflet.extras2)
library(rcartocolor)

# example raster data
r1 <- r2 <- raster(system.file("external/test.grd", package = "raster"))

# color palettes
pal1 <- colorNumeric(carto_pal(name = "OrYel"), 
                     values(r1), na.color = "transparent")
pal2 <- colorNumeric(carto_pal(name = "BluYl"), 
                     values(r2), na.color = "transparent")

# side by side map
leaflet() %>% 
  addMapPane("left",  zIndex = 0) %>%
  addMapPane("right", zIndex = 0) %>%
  addTiles(group = "base", layerId = "baseid",
           options = pathOptions(pane = "right")) %>%
  addTiles(group = "carto", layerId = "cartoid",
           options = pathOptions(pane = "left")) %>%
  addRasterImage(r1, colors = pal1, 
                 options = pathOptions(pane = "right"), group = "r1") %>%
  addRasterImage(r2, colors = pal2, 
                 options = pathOptions(pane = "right"), group = "r2") %>%
  addLayersControl(overlayGroups = c("r1", "r2")) %>% 
  addSidebyside(layerId = "sidecontrols",
                rightId = "baseid",
                leftId  = "cartoid")

The solution is pointed here by @RexParsons. @RexParsons 在这里指出了解决方案。
You will need addRasterImage 's options = leafletOptions(pane = "") that will be added to {leaflet} on next release.您将需要addRasterImageoptions = leafletOptions(pane = "")将在下一个版本中添加到{leaflet}
Step 1: for now you can install raster-options :第 1 步:现在您可以安装raster-options

remotes::install_github("rstudio/leaflet", ref="joe/feature/raster-options")

Step 2: Session -> Restart R第 2 步: Session -> Restart R

Step 3: add options = leafletOptions(pane = "") :第 3 步:添加options = leafletOptions(pane = "")

leaflet() |> 
  addMapPane("right", zIndex = 0) |> 
  addMapPane("left",  zIndex = 0) |>
  addTiles(group = "base", layerId = "baseid1", options = pathOptions(pane = "right")) |> 
  addTiles(group = "base", layerId = "baseid2", options = pathOptions(pane = "left")) |> 
  addRasterImage(x = r1, colors = pal1, options = leafletOptions(pane = "right"), group = "r1") |> 
  addRasterImage(x = r2, colors = pal2, options = leafletOptions(pane = "left"), group = "r2") |> 
  addLayersControl(overlayGroups = c("r1", "r2")) |>  
  addSidebyside(layerId = "sidecontrols",
                rightId = "baseid1",
                leftId  = "baseid2")

Output: Output:
在此处输入图像描述

Option 2 (with addProviderTiles ):选项 2(使用addProviderTiles ):

leaflet() |> 
  addMapPane("right", zIndex = 0) |> 
  addMapPane("left",  zIndex = 0) |>
  addTiles(group = "base", layerId = "baseid", options = pathOptions(pane = "right")) |>
  addProviderTiles(providers$CartoDB, group="carto", layerId = "cartoid", options = pathOptions(pane = "left")) |> 
  addRasterImage(x = r1, colors = pal1, options = leafletOptions(pane = "right"), group = "r1") |> 
  addRasterImage(x = r2, colors = pal2, options = leafletOptions(pane = "left"), group = "r2") |> 
  addLayersControl(overlayGroups = c("r1", "r2")) |>  
  addSidebyside(layerId = "sidecontrols",
                rightId = "baseid",
                leftId  = "cartoid")

Output: Output:
在此处输入图像描述

Does it work for you?对你起作用吗?

<-- Partial answer to the @oatmilkyway's question below --> <-- 下面对@oatmilkyway 问题的部分回答-->
Someone need to find a way to (conditionally) add/remove the leaflet.extras2::addSidebyside 's layerId 's, as one of possible solutions (if already exists, please let me know).有人需要找到一种方法来(有条件地)添加/删除leaflet.extras2::addSidebysidelayerId作为可能的解决方案之一(如果已经存在,请告诉我)。

leaflet() |> 
  addMapPane("right", zIndex = 0) |> 
  addMapPane("left", zIndex = 0) |>
  addTiles(group = "Base map", layerId = "baseid1", options = pathOptions(pane = "right")) |> 
  addTiles(group = "Base map", layerId = "baseid2", options = pathOptions(pane = "left")) |> 
  addProviderTiles(provider = providers$Esri.WorldImagery, group = "Satellite map", layerId = "satelliteid1", options = pathOptions(pane = "right")) |>
  addProviderTiles(provider = providers$Esri.WorldImagery, group = "Satellite map", layerId = "satelliteid2", options = pathOptions(pane = "left")) |>
  addRasterImage(x = r1, colors = pal1, options = leafletOptions(pane = "right"), group = "raster image 1") |> 
  addRasterImage(x = r2, colors = pal2, options = leafletOptions(pane = "left"), group = "raster image 2") |> 
  addLayersControl(baseGroups = c("Base map", "Satellite map"),
                   overlayGroups = c("raster image 1", "raster image 2")) |>  
  addSidebyside(layerId = "sidecontrols2", rightId = "satelliteid1", leftId  = "satelliteid2") |>
  addSidebyside(layerId = "sidecontrols", rightId = "baseid1", leftId  = "baseid2")
leaflet() |> 
  addMapPane("right", zIndex = 0) |> 
  addMapPane("left", zIndex = 0) |>
  addTiles(group = "Base and Carto Positron maps", layerId = "baseid", options = pathOptions(pane = "right")) |>
  addProviderTiles(provider = providers$CartoDB.Positron, group = "Base and Carto Positron maps", layerId = "cartoid", options = pathOptions(pane = "left")) |>
  addProviderTiles(provider = providers$Esri.WorldImagery, group = "Satellite and Toner Lite maps", layerId = "satelliteid", options = pathOptions(pane = "right")) |>
  addProviderTiles(provider = providers$Stamen.TonerLite, group = "Satellite and Toner Lite maps", layerId = "tonerlightid", options = pathOptions(pane = "left")) |>
  addRasterImage(x = r1, colors = pal1, options = leafletOptions(pane = "right"), group = "raster image 1") |> 
  addRasterImage(x = r2, colors = pal2, options = leafletOptions(pane = "left"), group = "raster image 2") |>
  addLayersControl(baseGroups = c("Base and Carto Positron maps", "Satellite and Toner Lite maps"),
                   overlayGroups = c("raster image 1", "raster image 2"),
                   options = layersControlOptions(collapsed = FALSE)) |> 
  addSidebyside(layerId = "sidecontrols2", rightId = "satelliteid", leftId  = "tonerlightid") |>
  addSidebyside(layerId = "sidecontrols", rightId = "baseid", leftId  = "cartoid")

Output: Output: 在此处输入图像描述

Although this is a clunky answer at best, I hope it may help you.尽管这充其量是一个笨拙的答案,但我希望它可以帮助您。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM