我正在尝试弄清楚如何根据用户输入放大地图。我从美国地图开始,然后尝试根据邮政编码和里程数放大到特定位置:
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。
答案 0 :(得分:1)
您的服务器代码存在一些问题。
renderLeaflet
功能可以简化eventReactive
代替使用observeEvent
。当您按下go
按钮时,将触发此功能。在观察者中,您必须添加应该由按钮单击触发的所有动作。因此,您还必须在此处插入leafletProxy
函数。~
函数中删除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))
})
})