使用文件上传控件为Leaflet地图添加标记的实现问题咨询
Shiny+Leaflet上传坐标文件标记地图问题修复
问题排查
- 布局语法错误:
sidebarLayout要求第一个参数为sidebarPanel,原代码未用该组件包裹文件上传控件,会导致UI渲染失败 - 文件读取错误:
read.csv('input$file$datapath')中用引号包裹了变量,相当于读取名为"input$file$datapath"的固定文件,无法识别实际上传的临时文件路径 - 无空值校验:用户未上传文件时观测事件仍会触发,会抛出文件不存在的运行时错误
- 标记无去重:多次上传文件时旧标记不会被清空,会出现标记叠加的问题
修复后完整代码
library(shiny) library(leaflet) ui <- fluidPage( titlePanel(title = "My Dashboard"), sidebarLayout( # 补充缺失的sidebarPanel组件 sidebarPanel( fileInput(inputId = "file", label = "File upload", accept = ".csv") ), mainPanel( leafletOutput("mymap") ) ) ) server <- function(input, output) { m <- leaflet() %>% setView(lng = -71.0589, lat = 42.3601, zoom = 12) %>% addProviderTiles(providers$CartoDB.Positron) output$mymap <- renderLeaflet(m) observe({ # 增加文件非空校验,未上传时不执行后续逻辑 req(input$file) # 去掉路径的引号,读取实际临时文件 df <- read.csv(input$file$datapath) proxy <- leafletProxy("mymap", data = df) # 先清空已有标记再添加新标记,避免重复堆叠 proxy %>% clearMarkers() %>% addMarkers(~long, ~lat) }) } shinyApp(ui = ui, server = server)
使用说明
- 上传的CSV文件需包含
long(经度)、lat(纬度)两个字段,字段名称需与代码中匹配 - 若你的坐标字段名为其他名称(如
lon、经度等),修改addMarkers参数中对应的字段名即可
内容的提问来源于stack exchange,提问作者Joseph Lavin
相关产品推荐
相关产品推荐

