R Shiny MapView: только перерисовать слой, а не всю карту (т.е. leafletProxy) - PullRequest
2 голосов
/ 17 марта 2020

Я пытаюсь имитировать c или выяснить, как работает функция, подобная leafletProxy, в пакете mapview внутри приложения Shiny (flexdashboard). Идея состоит в том, что у меня есть запрос к параметризованной базе данных, который выбирает набор данных sf (~ 4200 полигонов) на основе пользовательских данных, а затем составляет графики в виде карты. Однако, похоже, что каждый раз, когда это делается, карта вся перерисовывается?

Ниже приведен воспроизводимый пример использования набора данных по франконии по умолчанию и блестящего ввода для управления непрозрачностью линии. Я также включил свой код (закомментированный), чтобы показать пример того, как он будет использоваться по назначению (т.е. динамически перерисовывать слой многоугольника на основе выборки из базы данных)

Есть ли способ в блестящем нарисовать "базовая" карта всех стилей фоновых карт один раз, а затем только перерисовывает новые данные полигона по мере их получения?

Спасибо!


    ---
    title: "MRE"
    output: 
      flexdashboard::flex_dashboard:
        orientation: columns
        vertical_layout: fill
    runtime: shiny
    ---

    ```{r setup, include=FALSE}
    library(flexdashboard)
    library(mapview)
    library(shiny)
    library(leaflet)
    #library(RSQLite)
    #library(sf)
    ```


    Sidebar {.sidebar}
    -----------------------------------------------------------------------

    ```{r}
    # This is shiny input that will trigger entire map redraw
    sliderInput("gridlines", "Grid Line Opacity", 0, 1, 0, step = 0.1, ticks = FALSE)
    ```

    ```{r}
    ### THIS IS MY ACTUAL CODE...For reference

    # sp_grid <- reactive({
    #   db <- "../data/modeldata.db"
    #   con <- dbConnect(SQLite(), db )
    #   
    #   # set the sql based on user input
    #   sql <- 'SELECT id, Time,Cell_I, Cell_J, Cell_K, Cell_Botdepth_M, Zmax, Salinity, WKT_GEOMETRY 
    #                 FROM vwGridTK 
    #                 WHERE Time = :time 
    #                   AND Cell_K = :layer'
    #   
    #   df.grid <- dbGetQuery(con, sql, params = list(time = 0,
    #                                                layer = 1))
    #   dbDisconnect(con)
    #   
    #   st_as_sf(df.grid, wkt = "WKT_GEOMETRY") %>% st_set_crs(4326)
    #  
    # })

    ```

    Column {data-width=500}
    -----------------------------------------------------------------------

    ### Reproducible Example

NOTE the shiny input to control opacity

    ```{r}
    renderLeaflet({
      m <- mapview(franconia, zcol = "district", alpha = input$gridlines)
      m@map

    })

    ```

    Column {data-width=500}
    -----------------------------------------------------------------------

    ### My Example

    ```{r}

    # renderLeaflet({
    #     m <- mapview(sp_grid(), zcol = "Salinity",  
    #           legend = TRUE, alpha = input$gridlines)
    #   
    #   m@map
    # 
    # })
    ```
...