You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:42:03