Изменение базовых слоев в Leaflet для R без потери наложения

r shiny leaflet

586 просмотра

2 ответа

436 Репутация автора

Я пытаюсь изменить базовый слой в моем Shiny App программным способом. Так как я не хочу использовать LayerControl из Leaflet, а хочу иметь все элементы управления на одной панели. Я решил использовать блестящий и использовать toggleState для кнопки, чтобы переключаться между двумя базовыми слоями.

В данный момент я нахожусь в фазе, чтобы выяснить принципы изменения базового слоя, и, поскольку может быть виден только один базовый слой, кажется, что мне нужно удалить плитки изначально загруженного базового слоя.

При этом я могу изменить базовый слой при отображении, но в то же время базовый слой изменяется, я теряю оверлей. Как я могу избежать этого?

При повторном использовании кнопки я вижу по мерцанию, что наложение все еще там, но больше не поверх базового слоя.

Вот пример:

library(shiny)
library(leaflet)
library(shinydashboard)

# Definition of Sidebar elements
sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Maps", tabName = "maps", icon = icon("globe"),
      menuSubItem(
        HTML(paste("Diffuse kilder NH", tags$sub("3"), sep = "")),
        tabName = "map_dif_nh3", icon = icon("map-o"), selected = TRUE
      )
    )
  )
)

# Definition of body elements
body <- dashboardBody(
  tabItems(
    tabItem(tabName = "map_dif_nh3",
      box(
        width = 12,
        div(style = "height: calc(100vh - 80px);",
          leafletOutput(
            "m_dif_nh3", width = "100%", height = "100%"
          ),
          absolutePanel(id = "nh3_panel", class = "panel panel-default",
            fixed = TRUE, style = "opacity: 0.87",
            top = 80, left = "auto", right = 50, bottom = "auto",
            width = 285, height = "auto",
            fluidRow(
              column(width = 10, offset = 1,
                actionButton(inputId = 'btn_bgr_nh3', label = "", icon = icon("globe", class = "fa-lg"))
              )
            )
          )
        )
      )
    )
  )
)

ui <- dashboardPage(
  dashboardHeader(title = "Mixed layout"),
  sidebar,
  body
)


server <- function(input, output) {

  init_lat <- 56.085935208960585
  init_lon <- 10.29481415546154
  init_zoom <- 7

  output$m_dif_nh3 <- renderLeaflet({
    leaflet(height = "100%") %>%
    addProviderTiles("Stamen.Toner", layerId = 'mb_osm', group = "base") %>%
    setView(init_lon, init_lat, init_zoom) %>%
    addWMSTiles(
      "http://gis.au.dk/geoserver_test/PRTR/gwc/service/wms",
      layers = "PRTR:prtr_nh3_2014",
      layerId = "nh3_2014",
      group = "overlay",
      options = WMSTileOptions(format = "image/png",
        transparent = TRUE, opacity = 0.8
      )
    )
  })

  observeEvent(
    input$btn_bgr_nh3, {
      leafletProxy("m_dif_nh3") %>%
        addProviderTiles("Esri.WorldImagery", layerId = 'mb_pic', group = 'base')
      leafletProxy("m_dif_nh3") %>%
        removeTiles(layerId = 'mb_osm')
    }
  )
}

shinyApp(ui, server)
Автор: TomGeo Источник Размещён: 19.07.2016 09:46

Ответы (2)


0 плюса

641 Репутация автора

Я думаю, что вы можете сделать, это сбросить значение идентификатора кнопки действия до 0 после нажатия кнопки. Поэтому при каждом переключении значение идентификатора будет заменено на 0. Это сработало для меня. Надеюсь, это сработает и для вас.

Автор: Bhushan Pant Размещён: 19.07.2016 11:59

0 плюса

1128 Репутация автора

В Leaflet JS (я не знаю о R), если myTileLayerон уже является частью ваших базовых слоев, то myTileLayer.addTo(map)выполняет работу по переключению. Это не добавляет сверху; и вам не нужно удалять текущий слой. Наложение остается неизменным.

Ссылка: https://stackoverflow.com/a/33762133/4355695

Автор: Nikhil VJ Размещён: 23.04.2019 08:54
Вопросы из категории :
32x32