如何在Shiny应用的leaflet地图中跳转至筛选后标记并自动居中?
修复方案
错误原因
flyTo()调用参数错误:通过leafletProxy管道调用时无需重复指定map = "mymap",管道已经将地图代理对象作为第一个参数传入函数- 经纬度参数错误:
flyTo()要求传入单个经纬度坐标作为中心点,你传入了选中州所有事故点的经纬度向量,函数无法正常解析 - 存在未定义变量:初始地图渲染代码中的
icon = icons引用了不存在的icons变量,会直接导致地图初始化失败 - 补充说明:如果希望自动适配所有选中事故点的可视范围,使用
flyToBounds()比flyTo()更合适,无需手动计算中心点,会自动缩放居中展示所有选中的点位
修正后可运行代码
if(!require('leaflet')){install.packages('leaflet'); library('leaflet')} if(!require('shiny')){install.packages('shiny'); library('shiny')} if(!require('tidyverse')){install.packages('tidyverse'); library('tidyverse')} veloaua <- read_csv(file = 'https://raw.githubusercontent.com/nicoschreibt/velovaua/master/veloaua_github.csv?token=AP64ETIQHSXQADG2GKFM6B3BEVLM6') veloaua <- veloaua[sample(1:nrow(veloaua), size = 100),] ui <- fluidPage( selectInput(inputId = "kant", label = "Welchen Kanton willst du sehen?", choices = unique(veloaua$CantonCode)), leafletOutput("mymap") ) server <- function(input, output, session) { output$mymap <- renderLeaflet({ leaflet() %>% addProviderTiles(providers$Stamen.Toner, options = providerTileOptions(minZoom = 8, maxZoom = 20)) %>% addMarkers(data = veloaua, lng = ~wgs84_e, lat = ~wgs84_n, popup = ~poptext, group = "main") }) observeEvent(input$kant, { # 提前筛选对应州的事故数据,避免重复计算 selected_accidents <- veloaua[veloaua$CantonCode == input$kant, ] leafletProxy("mymap")%>% clearGroup("main") %>% addMarkers(data = selected_accidents, lng = ~wgs84_e, lat = ~wgs84_n, popup = ~poptext, group = "main", clusterOptions = markerClusterOptions( removeOutsideVisibleBounds = TRUE, showCoverageOnHover = FALSE, disableClusteringAtZoom = 15)) %>% # 方案1:自动适配所有选中点位的边界,自动调整缩放等级和居中位置 flyToBounds(lng1 = min(selected_accidents$wgs84_e), lng2 = max(selected_accidents$wgs84_e), lat1 = min(selected_accidents$wgs84_n), lat2 = max(selected_accidents$wgs84_n)) # 方案2:固定缩放等级,手动计算中心点使用flyTo # flyTo(lng = mean(selected_accidents$wgs84_e), # lat = mean(selected_accidents$wgs84_n), # zoom = 10) } ) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Nico Saameli
相关产品推荐
相关产品推荐

