我正在尝试使用 Leaflet 绘制大约 8000 个多边形时遇到性能问题。由于我在 Shiny 应用中使用该地图,我想知道是否有可能以某种方式缓存或预渲染地图。
请注意,在我的情况下,我有不同层次的多边形,可按照此方法进行交换。
一个小的 MWE 如下:
数据可以从这里下载
library(shiny)
library(leaflet)
library(sf)
## Download Shapefile
file <- "plz-gebiete.shp"
if (!file.exists(file)) {
url <- "https://www.suche-postleitzahl.org/download_files/public/plz-gebiete.shp.zip"
zipfile <- paste0(file, ".zip")
download.file(url, zipfile)
unzip(zipfile)
}
df <- st_read(file, options = "ENCODING=UTF-8")
# If possible: pre-render the map here!
library(shiny)
ui <- fluidPage(
leafletOutput("mymap", width = "700px", height = "700px")
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addPolygons(data = df, weight = 1, color = "black")
})
}
shinyApp(ui, server)
在我的计算机上,渲染该地图及其多边形需要大约16秒。
如果可能的话,我想预先渲染地图一次,将其保存为.rds
文件,并按需加载。请注意,我知道应用程序中地图的宽度/高度(这里设置为700像素)。但是类似以下的内容:
map <- renderLeaflet({leaflet() %>% ...})
saveRDS(map, "renderedmap.rds")
map <- readRDS("renderedmap.rds")
# within server()
output$mymap <- map
不会产生任何性能提升。
另外,我尝试异步加载leaflet,以便可以渲染/交互应用程序的其他部分,但是没有成功。
有什么解决或规避这个问题的方法吗?
leafem::addFgb
,它们都使用高效的Flatgeobuf格式。 - SeGaaddFgb
看起来是一个不错的解决方案。您介意发布一个完整的示例吗? - David