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

在Shiny的Leaflet地图中点击获取经纬度并存储的问题求助

问题修正方案

核心问题分析

  1. UI结构语法错误:你的UI代码缺少顶层容器(如dashboardPage/fluidPage),且语法标点错误。
  2. 点击事件监听错误:地图中添加的是多边形(addPolygons),对应的点击事件应为input$map_shape_click,而非map_marker_click(该事件仅适用于标记点)。
  3. 变量未定义:代码中pal、popup.cont、apartment_map未提供定义,需提前准备。
  4. 展示逻辑不一致: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:30:22