我正在尝试使用传单映射〜8000个多边形并遇到性能问题。当我在一个闪亮的应用程序中使用地图时,我想知道是否有可能以某种方式缓存或预渲染该地图。
请注意,在我的情况下,我使用这种方法交换了不同的多边形层。
一个小的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
文件,然后按需加载。请注意,我知道应用内地图的宽度/高度(此处设置为700px)。但是类似
map <- renderLeaflet({leaflet() %>% ...})
saveRDS(map, "renderedmap.rds")
map <- readRDS("renderedmap.rds")
# within server()
output$mymap <- map
不会导致任何性能提升。
另外,我尝试异步加载传单,以便应用程序的其他部分可以渲染/交互,但无济于事。
有什么想法可以解决或解决这个问题吗?
以下2种方法不能完全回答您的问题,但与相比,它们绝对是性能更高的替代方案leaflet::addPolygons
。
使用Flatgeobuf格式:
根据来自的描述leafem::addFgb
:
Flatgeobuf可以逐块地流传输数据,以便地图的呈现或多或少是瞬时的。当数据仍在加载时,地图是响应式的,即使尚未渲染所有数据,弹出查询,缩放和平移也将起作用。
我认为数据集是线串,这就是为什么fillColor
似乎被忽略的原因。
library(leaflet)
library(leafem)
library(shiny)
# via URL (data around 13mb)
url = "https://raw.githubusercontent.com/bjornharrtell/flatgeobuf/3.0.1/test/data/UScounties.fgb"
ui <- fluidPage(
leafletOutput("mymap", width = "700px", height = "700px")
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
leafem:::addFgb(
url = url, group = "counties",
label = "NAME", popup = TRUE,
fillColor = "blue", fillOpacity = 0.6,
color = "black", weight = 1) %>%
addLayersControl(overlayGroups = c("counties")) %>%
setView(lng = -105.644, lat = 51.618, zoom = 3)
})
}
shinyApp(ui, server)
使用leafgl
(WebGL-Renderer):
library(sf)
library(shiny)
library(leaflet)
library(leafgl)
plz <- st_read("C:/Users/user/Downloads/plz-gebiete.shp", layer = "plz-gebiete")
ui <- fluidPage(
leafletOutput("mymap", width = "700px", height = "700px")
)
server <- function(input, output, session) {
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addGlPolygons(data = plz, color = ~plz, popup = "note", group = "plz") %>%
addLayersControl(overlayGroups = "plz")
})
}
shinyApp(ui, server)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句