Увеличить карту листовки на основе пользовательских данных - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь выяснить, как увеличить масштаб карты на основе пользовательских данных. Я начал с карты США, а затем попытался приблизиться к определенному месту на основе почтового индекса и количества миль:

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 голосов
/ 11 января 2019

Есть несколько проблем с кодом вашего сервера.

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