处理传单中的大型Geojson文件

问题描述 投票:0回答:1

有人知道如何在短时间内在交互式地图上渲染大量多边形吗?更具体地说,我使用“leaflet”R 包将交互式地图作为基础,我想在其中添加一个由法国城市轮廓(大约 40000 个多边形)组成的图层。城市需要根据某些参数“动态”着色,因此如果我更改这些参数,城市可能需要在现场用不同的颜色重新着色。

我在网上看到减轻这项工作的方法是简化多边形的形状,所以我遵循了在这里解释的方法(“Comment ont été générés ces fichiers?”部分),这让我可以从一个沉重的开始.shp 文件并最终得到一个更轻的 geojson 文件。 然而,“即时”绘制所有这些多边形的过程仍然需要大约二十秒,这破坏了整个交互体验。

由于城市的轮廓一旦绘制就不能改变,我想知道是否有一种方法可以保存它们的形状,以便它们只需要绘制一次,并且在发生变化时可以更快地着色。或者是否有一种更快的方法来完成整个过程。

r shiny r-leaflet
1个回答
0
投票

如果您使用

 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)
© www.soinside.com 2019 - 2024. All rights reserved.