有人知道如何在短时间内在交互式地图上渲染大量多边形吗?更具体地说,我使用“leaflet”R 包将交互式地图作为基础,我想在其中添加一个由法国城市轮廓(大约 40000 个多边形)组成的图层。城市需要根据某些参数“动态”着色,因此如果我更改这些参数,城市可能需要在现场用不同的颜色重新着色。
我在网上看到减轻这项工作的方法是简化多边形的形状,所以我遵循了在这里解释的方法(“Comment ont été générés ces fichiers?”部分),这让我可以从一个沉重的开始.shp 文件并最终得到一个更轻的 geojson 文件。 然而,“即时”绘制所有这些多边形的过程仍然需要大约二十秒,这破坏了整个交互体验。
由于城市的轮廓一旦绘制就不能改变,我想知道是否有一种方法可以保存它们的形状,以便它们只需要绘制一次,并且在发生变化时可以更快地着色。或者是否有一种更快的方法来完成整个过程。
如果您使用
options = pathOptions(className =...
为每个多边形指定一个类,那么您可以使用 javascript 为它们重新着色,从而避免每次都重新绘制多边形。不幸的是,我在 leafgl::addGlPolygons
中看不到等效的方法来给他们上课。这是一个例子:
library(shiny)
library(leaflet)
library(sf)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
leafletOutput("mymap"),
actionButton("change_color", "Change Polygon Color"),
)
# Define server logic
server <- function(input, output, session) {
# Create a polygon using sf
polygon_sf <- st_sf(geometry = c(st_sfc(st_polygon(list(rbind(
c(-0.08, 51.509),
c(-0.06, 51.503),
c(-0.047, 51.51),
c(-0.08, 51.509)
)))),
st_sfc(st_polygon(list(rbind(
c(-0.18, 51.509),
c(-0.16, 51.503),
c(-0.147, 51.51),
c(-0.18, 51.509)
))))
))
# Render the leaflet map
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
setView(lng = -0.09, lat = 51.505, zoom = 13) %>%
addPolygons(data = polygon_sf,
options = pathOptions(className = c("poly1", "poly2")),
color = "blue",
fillColor = "blue",
fillOpacity = 0.5)
})
observeEvent(input$change_color, {
runjs("
var elements = document.getElementsByClassName('poly1');
for (var i = 0; i < elements.length; i++) {
elements[i].setAttribute('fill', 'red');
}")
})
}
# Run the application
shinyApp(ui = ui, server = server)