【问题标题】:Filtering leaflet map data in shiny在闪亮中过滤传单地图数据
【发布时间】:2018-10-12 04:36:28
【问题描述】:

我无法使用传单地图设置此闪亮。我的original post 有两个问题,建议我开一个新帖子来解决我的第二个问题:我如何在按速度过滤后获取地图以显示我的更新数据;无论我更改“速度”还是地图边界,我的表格都会更新,但传单地图不会根据速度过滤器输入更新点。

可重现的代码

library(shiny)
library(magrittr)
library(leaflet)
library(DT)

ships <-
  read.csv(
    "https://raw.githubusercontent.com/Appsilon/crossfilter-demo/master/app/ships.csv"
  )

ui <- shinyUI(fluidPage(
  titlePanel("Filter"),
  sidebarLayout(
    sidebarPanel(width = 3,
                 numericInput(
                   "speed_f", label = h5("Ship's Speed"), value = 100
                 )),
    mainPanel(tabsetPanel(
      type = "tabs",
      tabPanel(
        "Leaflet",
        leafletOutput("leafletmap", width = "350px"),
        dataTableOutput("tbl")
      )
    ))
  )
))

server <- function(input, output) {
  in_bounding_box <- function(data, lat, long, bounds, speed) {
    data %>%
      dplyr::filter(
        lat > bounds$south &
          lat < bounds$north &
          long < bounds$east & long > bounds$west & 
          speed > input$speed_f
      )
  }

  output$leafletmap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Esri.WorldImagery", group = "ESRI World Imagery") %>%
      addCircleMarkers(
        data = ships,
        ~ long ,
        ~ lat,
        popup =  ~ speed,
        radius = 5 ,
        stroke = FALSE,
        fillOpacity = 0.8,
        popupOptions = popupOptions(closeButton = FALSE)
      )
  })

  data_map <- reactive({
    if (is.null(input$leafletmap_bounds)) {
      ships
    } else {
      bounds <- input$leafletmap_bounds
      in_bounding_box(ships, lat, long, bounds, speed)
    }
  })

  output$tbl <- DT::renderDataTable({
    DT::datatable(
      data_map(),
      extensions = "Scroller",
      style = "bootstrap",
      class = "compact",
      width = "100%",
      options = list(
        deferRender = TRUE,
        scrollY = 300,
        scroller = TRUE,
        dom = 'tp'
      )
    )
  })


}

shinyApp(ui = ui, server = server)

更新

进行以下更改data = data_map() 似乎可行,但有一个例外:

  output$leafletmap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Esri.WorldImagery", group = "ESRI World Imagery") %>%
      addCircleMarkers(
        data = data_map(), #### THIS LINE HAS CHANGED
        ~ long ,
        ~ lat,
        popup =  ~ speed,
        radius = 5 ,
        stroke = FALSE,
        fillOpacity = 0.8,
        popupOptions = popupOptions(closeButton = FALSE)
      )
  })

但是,传单地图不允许我缩小过滤点定义的区域。有没有办法解决这个问题?

【问题讨论】:

    标签: r filter shiny leaflet r-leaflet


    【解决方案1】:

    如果您仅为地图数据定义一个反应式并在renderLeaflet 中使用它,它应该允许您移出已定义的区域。您无需更改任何其他函数或响应式,只需添加新的响应式并对renderLeaflet 进行一些更改,如下所示

    map_data_react <- reactive({
    
        ships %>% dplyr::filter(speed > input$speed_f)
    
    })
    
    
    output$leafletmap <- renderLeaflet({
    
        ships_data <- map_data_react()  # Add this
    
        ships_data %>% leaflet() %>%
          addProviderTiles("Esri.WorldImagery", group = "ESRI World Imagery") %>%
          addCircleMarkers(
              ~ long ,  # Removed `data = data_map()`
              ~ lat,
              popup =  ~ speed,
              radius = 5 ,
              stroke = FALSE,
              fillOpacity = 0.8,
              popupOptions = popupOptions(closeButton = FALSE)
      )
    })
    

    【讨论】:

    • 这很棒。谢谢你。有什么办法可以避免地图重绘到过滤后的速度数据的范围(例如,如果我放大一个区域并更改速度值,它将重绘到过滤后的数据的范围内,而我只想重绘过滤后的数据这些范围内的数据)。
    猜你喜欢
    • 2018-03-13
    • 2016-12-29
    • 2019-09-03
    • 2023-01-11
    • 2023-03-24
    • 2021-12-19
    • 1970-01-01
    • 2017-05-05
    • 2019-07-04
    相关资源
    最近更新 更多