根据用户输入放大传单地图

时间:2019-01-07 12:21:26

标签: r shiny leaflet

我正在尝试弄清楚如何根据用户输入放大地图。我从美国地图开始,然后尝试根据邮政编码和里程数放大到特定位置:

shinyUI(fluidPage(

  # Application title
  titlePanel("Starbucks Locator"),

  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
       textInput("zip","Zip Code:", value = "18101"),
       sliderInput("radius",
                   "Radius",
                   min = 1,
                   max = 25,
                   value = 15),
       actionButton("go", "Submit")
    ),

    # Show a plot of the generated distribution
    mainPanel(
       leafletOutput("myMap")
    )
  )
))

这是服务器代码:

library(shiny)
library(ZipRadius)
library(leaflet)
shinyServer(function(input, output) {
    data  <- reactive({x <- readRDS("Starbucks.rds")})
  output$myMap <- renderLeaflet({
    df    <- data()
    m     <- leaflet(data = df) %>% 
             addTiles() %>%
             addMarkers(lng = ~Lon, lat = ~Lat)

  })
  eventReactive(input$go, {
    zip_include  <- zipRadius(input$zip, input$radius)
  })
  leafletProxy("myMap") %>% fitBounds(~min(zip_include$longitude), ~min(zip_include$latitude),
                                      ~max(zip_include$longitude), ~max(zip_include$latitude))
})

我正在使用ZipRadius软件包来查找与input$distance距离input$zip的邮政编码。然后,我想放大输入的邮政编码作为中心以及半径(input$distance)定义的范围。原始的leaflet地图有效,但是leafletProxy是我遇到问题的地方。有关如何执行此操作的任何想法?我正在尝试使用fitbounds,因为它可以考虑最小和最大纬度和经度。我认为问题可能出在eventReactive上,但不确定如何测试。数据集位于github

1 个答案:

答案 0 :(得分:1)

您的服务器代码存在一些问题。

  1. 您不需要在反应式表达式中创建数据。由于您仅上传一次(我想您不会更改坐标或添加另一行)。
  2. 您的renderLeaflet功能可以简化
  3. 使用eventReactive代替使用observeEvent当您按下go按钮时,将触发此功能。在观察者中,您必须添加应该由按钮单击触发的所有动作。因此,您还必须在此处插入leafletProxy函数。
  4. ~函数中删除fitBounds符号。您已经指向zip_include中的fitBounds数据集。

工作服务器(具有提供的csv)

shinyServer(function(input, output) {
  data  <- read.csv("c:/starbucks_us_locations.csv")
  names(data) <- c('Lon', 'Lat')
  output$myMap <- renderLeaflet({leaflet(data) %>% 
      addTiles() %>%
      addMarkers(lng = ~Lon, lat = ~Lat)
  })

  observeEvent(input$go, {
    zip_include  <- zipRadius(input$zip, input$radius)
    print(zip_include)
    leafletProxy("myMap") %>% fitBounds(min(zip_include$longitude), min(zip_include$latitude),
                                        max(zip_include$longitude), max(zip_include$latitude))
  })
})