我正在尝试弄清楚如何根据用户输入放大地图。我从美国地图开始,然后尝试根据邮政编码和英里数放大到特定位置:
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 获取。
您的服务器代码存在一些问题。
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))
})
})