开发者问题收集

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

2019-01-07
725

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

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$zipinput$distance 。然后我想放大输入邮政编码作为中心和半径定义的边界( input$distance )。原始 leaflet 地图有效,但 leafletProxy 是我遇到问题的地方。关于如何做到这一点有什么想法吗?我正在尝试使用 fitbounds ,因为它可以考虑最小和最大纬度和经度。我认为问题可能出在 eventReactive 上,但不确定如何测试它。数据集可在 github 上找到。

1个回答

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

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

工作服务器(提供 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))
  })
})
Wilmar van Ommeren
2019-01-11