我正在创建一个 Shiny/Leaflet 应用程序,类似于 这个在 tableau 中完成的应用程序。它显示了不同年份的世界级贫困状况,允许用户按变量、地区和年份过滤地图。
问题是全球国家级形状文件(来自 NaturalEarthData)渲染速度相当慢。我正在研究不同的方法来简化这些多边形以减少加载时间,但与此同时,我正在研究其他潜在的解决方案。
理想情况下,我会使用 Shiny 控件来切换不同的地图图层并使用
leafletProxy
来更新地图。但由于每次图层更改都会重新绘制整个地图,因此速度也相当慢。
当我在传单中包含不同的图层时,图层的渲染速度要快得多。 (我认为这是因为 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
中使用它。这可能吗/我该怎么做?
{MAP_ID}_groups
输入定义一个观察者。
示例:
server <- function(input, output, session) {
# ...
output$my_map <- renderLeaflet({
# ...
})
observe({
selected_groups <- req(input$my_map_groups)
# do whatever ...
})
}
当用户在图层控件中选择一个组时,此输入会更新。