在Shiny的Leaflet地图中点击获取经纬度并存储的问题求助
问题修正方案
核心问题分析
- UI结构语法错误:你的UI代码缺少顶层容器(如
dashboardPage/fluidPage),且语法标点错误。 - 点击事件监听错误:地图中添加的是多边形(
addPolygons),对应的点击事件应为input$map_shape_click,而非map_marker_click(该事件仅适用于标记点)。 - 变量未定义:代码中
pal、popup.cont、apartment_map未提供定义,需提前准备。 - 展示逻辑不一致:valueBox展示纬度值,但副标题标注为"Longitude value",需修正对应关系。
修正后的完整代码
# 加载依赖包 library(shiny) library(leaflet) library(shinydashboard) # 示例数据(替换为你的真实apartment_map数据) apartment_map <- quakes %>% sf::st_as_sf(coords = c("long", "lat"), crs = 4326) %>% dplyr::mutate(NAME_2 = paste("Region", 1:nrow(.)), price_mean = mag) # 颜色映射器(替换为你的pal逻辑) pal <- colorNumeric(palette = "viridis", domain = apartment_map$price_mean) # 弹窗内容(替换为你的popup.cont逻辑) popup.cont <- paste0("Price: ", apartment_map$price_mean) ui <- dashboardPage( dashboardHeader(title = "Leaflet Click Demo"), dashboardSidebar(), dashboardBody( leafletOutput("map", width = 800, height = 800), valueBoxOutput("lat_box"), valueBoxOutput("lng_box") ) ) server <- function(input, output, session){ ## Leaflet地图渲染 output$map <- renderLeaflet({ leaflet(apartment_map) %>% addProviderTiles(providers$CartoDB.DarkMatter) %>% addPolygons(fillColor = ~pal(price_mean), weight = 1, opacity = 1, color = "black", dashArray = "3", fillOpacity = 0.5, label = paste0("Kecamatan: ", apartment_map$NAME_2), popup = popup.cont) %>% addLegend("bottomright", pal = pal, values = ~price_mean, title = "Apartment Price Mean", labFormat = labelFormat(digits = 2), opacity = 1) }) # 存储经纬度的响应式变量 coordinates <- reactiveValues(latitude = NULL, longitude = NULL) # 监听多边形点击事件,获取经纬度 observeEvent(input$map_shape_click, { click <- input$map_shape_click if (!is.null(click)) { coordinates$latitude <- click$lat coordinates$longitude <- click$lng } }) # 展示纬度值 output$lat_box <- renderValueBox({ valueBox( value = ifelse(is.null(coordinates$latitude), "未点击", round(coordinates$latitude, 4)), subtitle = "Latitude (纬度)", color = "blue" ) }) # 展示经度值 output$lng_box <- renderValueBox({ valueBox( value = ifelse(is.null(coordinates$longitude), "未点击", round(coordinates$longitude, 4)), subtitle = "Longitude (经度)", color = "green" ) }) } shinyApp(ui, server)
关键修改说明
- 补全UI顶层容器
dashboardPage,符合Shiny Dashboard结构要求。 - 将点击事件从
map_marker_click改为map_shape_click,匹配多边形点击的事件类型。 - 添加示例数据和变量定义,你可以直接替换为自己的真实数据逻辑。
- 拆分纬度和经度的展示盒子,修正内容与副标题的对应关系,增加未点击时的提示文本。
- 对经纬度值做四舍五入处理,提升展示可读性。
内容的提问来源于stack exchange,提问作者MF-Faqih
相关产品推荐
相关产品推荐

