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

问题描述 投票:0回答:1

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

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 获取。

r shiny r-leaflet
1个回答
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))
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.