闪亮地过滤传单地图数据 [英] Filtering leaflet map data in shiny

查看:84
本文介绍了闪亮地过滤传单地图数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在设置带有传单的地图时遇到麻烦.我的原始帖子有两个问题,并提出了建议我应该写一篇新文章来解决我的第二个问题:在按速度过滤后,如何获取地图以显示更新的数据;无论更改速度"还是更改地图边界,我的表都会更新,但是传单地图不会根据速度过滤器的输入来更新点.

I'm having trouble setting up this shiny with a leaflet map. My original post had two questions and it was suggested I should start a new post to address my second issue: how do I get the map to show my updated data after I have filtered by speed; my table gets updated whether I change "speed" or the map bounds, but the leaflet map does not update points based on the speed filter input.

可复制代码

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()似乎可行,但例外:

Making the following change data = data_map() seems to work, with an exception:

  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)
      )
  })

但是,传单地图不允许我缩小由过滤点定义的区域.有办法解决吗?

However, the leaflet map does not let me zoom out of the area defined by the filtered points. Is there a way around this?

推荐答案

如果仅为地图数据定义一个反应式,并在renderLeaflet中使用它,则应允许您从定义中移出.您无需更改任何其他功能或反应式,只需添加新的反应式,然后对renderLeaflet进行如下更改

If you define a reactive just for the map data and use that within renderLeaflet it should allow you to then move out of the are defined. You don't need to change any of your other functions or reactives, just add the new reactive and make a couple of changes to renderLeaflet as below

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)
  )
})

这篇关于闪亮地过滤传单地图数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆