代码之家  ›  专栏  ›  技术社区  ›  akash87

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

  •  0
  • akash87  · 技术社区  · 7 年前

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

    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 . 然后我想放大输入的邮政编码,作为半径定义的中心和边界。( 输入$距离 )原文 leaflet 地图可以用,但是 leafletProxy 是我的问题所在。有什么关于怎么做的想法吗?我想用 fitbounds 因为它可以考虑最小和最大纬度和经度。我认为问题可能在于 eventReactive 但不确定如何测试它。数据集在此处可用 github .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wilmar van Ommeren    7 年前

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

    1. 您不需要在反应式中创建数据。因为您只上传一次(我猜您不会更改坐标或添加另一行)。
    2. 你的 renderLeaflet 功能可以简化
    3. 而不是使用 eventReactive 使用 observeEvent . 当您按下 go 按钮。在观察者中,您必须添加所有应该由按钮单击触发的操作。所以你也必须插入 leafletProxy 功能在这里。
    4. 移除 ~ 中的符号 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))
      })
    })
    
    推荐文章