【问题标题】:Is it possible to access R Leaflet layer controls in Shiny (outside of leaflet)?是否可以在 Shiny(传单之外)访问 R Leaflet 图层控件?
【发布时间】:2017-05-19 00:32:32
【问题描述】:

我正在创建一个类似于this one that's done in tableau 的 Shiny/Leaflet 应用程序。它显示了不同年份的世界级贫困视图,允许用户按变量、地区和年份过滤地图。

问题在于全球国家级 shapefile(来自 NaturalEarthData)的渲染速度很慢。我正在研究不同的方法来简化这些多边形以减少加载时间,但与此同时,我正在研究其他潜在的解决方案。

理想情况下,我会使用 Shiny 控件来切换不同的地图图层并使用leafletProxy 来更新地图。但是因为每次图层的变化都会重新绘制整个地图,这也很慢。

当我在inside Leaflet 中包含不同的层时,这些层的渲染速度要快得多。 (我认为这是因为 Leaflet 中的addLayersControl 选项仅更改了多边形的fillColor,而不是像leafletProxy 那样重绘整个全局shapefile)。但是有没有办法在 Leaflet 之外访问这些层?

为了说明,这里有一些虚拟代码:

#load required libraries 
library(shiny)
library(leaflet)
library(raster)

#begin shiny app
shinyApp(

  ui <- fluidPage(
    leafletOutput("map", width = "100%", height = 600) 
  ), #END UI

  server <- function(input, output, session){

    #load shapefile
    rwa <- getData("GADM", country = "RWA", level = 0)

    #render map
    output$map <- renderLeaflet({
      leaflet() %>% 
        addTiles() %>% 
        addPolygons(data = rwa, 
                    fillColor = "blue", 
                    group = "blue") %>% 
        addPolygons(data = rwa, 
                    fillColor = "red", 
                    group = "red") %>% 
        addLayersControl(baseGroups = c("blue", "red"), 
                         options = layersControlOptions(collapsed = F))
    }) #END RENDER LEAFLET 
  } #END SERVER
) #END SHINY APP

具有以下输出:

您可以轻松地在传单地图对象内的蓝色和红色图层之间切换。但是,假设当我将地图图层从蓝色切换到红色时,我想要一个闪亮的表格来更新红色多边形图层的属性。我希望能够将这个对象拉到传单之外并在闪亮的observeEvent 中使用它。这可能吗/我该怎么做?

【问题讨论】:

  • 我还没有看到一种方法可以让您观察“layersControl”被点击,但您可以观察到多边形被点击,如this answer
  • 也许这个stackoverflow.com/questions/28938642/… 也有帮助
  • 也许这有帮助:stackoverflow.com/a/41668048/3502164。如果您需要进一步说明您的挑战,请告诉我。
  • @TonioLiebrand 我能够让您的最小示例工作,但没有任何运气将其集成到更大的应用程序中。在我的实际代码中,有几个不同的输入(包括 Leaflet 层控件),这似乎是问题所在。我尝试了您在其他回复中建议的console.log 声明,但无济于事。还有什么其他的故障排除技巧吗?
  • 嗨@Lauren,我试过了。它可以更改为切换,但这不会改变颜色:D 地图的颜色在 内,因此您可以在那里设置颜色。我第一次尝试使用“document.getElementsByClassName("leaflet-zoom-animated")”访问它失败了,所以我会在那里查看,稍后我可以向您展示多个输入的问题。

标签: r shiny leaflet


【解决方案1】:

您可以在 Shiny 服务器中为 {MAP_ID}_groups 输入定义观察者。

例子:

server <- function(input, output, session) {
    # ...

    output$my_map <- renderLeaflet({
        # ...
    })

    observe({
        selected_groups <- req(input$my_map_groups)
        # do whatever ... 
    })
}

当用户在图层控件中选择一个组时,此输入会更新。

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2023-03-22
    • 2021-12-27
    • 2018-08-31
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多