根据用户输入放大传单地图
2019-01-07
725
我正在尝试弄清楚如何根据用户输入放大地图。我先从美国地图开始,然后尝试根据邮政编码和英里数放大到特定位置:
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$zip
为
input$distance
。然后我想放大输入邮政编码作为中心和半径定义的边界(
input$distance
)。原始
leaflet
地图有效,但
leafletProxy
是我遇到问题的地方。关于如何做到这一点有什么想法吗?我正在尝试使用
fitbounds
,因为它可以考虑最小和最大纬度和经度。我认为问题可能出在
eventReactive
上,但不确定如何测试它。数据集可在
github
上找到。
1个回答
您的服务器代码存在一些问题。
- 您无需在反应式表达式中创建数据。因为您只上传一次(我猜您不会更改坐标或添加另一行)。
-
您的
renderLeaflet
函数可以简化 -
不要使用
eventReactive
,而要使用observeEvent
。 当您按下go
按钮时会触发此函数。在观察者中,您必须添加按钮单击应触发的所有操作。因此,您还必须在此处插入leafletProxy
函数。 -
删除
fitBounds
函数中的~
符号。您已指向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))
})
})
Wilmar van Ommeren
2019-01-11