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

如何在R Shiny Leaflet中显示重叠标记/多边形的数量?

解决Leaflet中重叠位置标记的数量显示问题

针对你处理大型位置数据时遇到的经纬度重复、需要显示重叠标记数量的需求,提供两种可行方案:

方案1:在单个标记弹窗中显示重叠信息

该方案保留所有原始标记,点击任意标记时,弹窗内会展示当前位置的总重叠位点数量,以及该位置下的所有位点ID列表。

修改后的完整代码:

#############################################
# Needed Libraries & Input Files

library(shiny)
library(shinydashboard)
library(leaflet)
library(dplyr)

## The Data
Point_ID = c("A1", "B1", "C1")
Latitude = c(38.00, 38.00, 38.00)
Longitude = c(-107.00, -107.00, -107.00)
Map_DF <- data.frame(Point_ID, Latitude, Longitude)

choiseList <- c("A1", "B1", "C1")

#############################################
# UI
ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(checkboxGroupInput(inputId = "IDPointInput", label = "Select Point ID", choices = choiseList, selected = choiseList)),
  dashboardBody(fluidRow(leafletOutput(outputId = 'mapA')))
)

#############################################
# SERVER
server <- function(input, output, session) {
  
  ## 过滤数据并计算重叠统计信息
  filter_df <- reactive({
    filtered <- Map_DF[Map_DF$Point_ID %in% input$IDPointInput, ]
    
    # 按经纬度分组,统计重叠数量和所有位点ID
    overlap_stats <- filtered %>%
      group_by(Latitude, Longitude) %>%
      summarise(
        overlap_count = n(),
        all_point_ids = paste(Point_ID, collapse = ", ")
      ) %>%
      ungroup()
    
    # 将统计结果合并回原始过滤数据
    filtered %>%
      left_join(overlap_stats, by = c("Latitude", "Longitude"))
  })
  
  ## 初始化基础地图
  output$mapA <- renderLeaflet({
    leaflet() %>%
      addProviderTiles(
        providers$Esri.DeLorme,
        options = providerTileOptions(
          updateWhenZooming = FALSE,
          updateWhenIdle = TRUE)
      ) %>%
      setView(lng = -107.50, lat = 39.00, zoom = 7)
  })
  
  ## 根据选择更新地图标记
  observe({
    leafletProxy("mapA", session) %>%
      clearMarkers() %>%
      addCircleMarkers(
        data = filter_df(),
        radius = 10,
        color = "red",
        lat = ~Latitude,
        lng = ~Longitude,
        popupOptions(autoPan = FALSE),
        popup = ~paste(
          "<strong>PointID:</strong>", Point_ID, "<br>",
          "<strong>该位置重叠位点总数:</strong>", overlap_count, "<br>",
          "<strong>所有重叠位点ID:</strong>", all_point_ids
        )
      )
  })
}

############################################
shinyApp(ui = ui, server = server)

关键改动说明

  • 引入dplyr包实现按经纬度分组统计,计算每个位置的重叠位点数量和所有关联ID
  • 在弹窗中扩展内容,除单个位点ID外,增加总重叠数和完整的重叠位点ID列表
  • 确保每个标记都携带所在位置的重叠统计信息,点击即可查看

方案2:使用聚类标记聚合重叠位点

针对大型数据集,逐个显示标记会导致地图拥挤,推荐使用Leaflet的标记聚类功能:自动将重叠/邻近标记聚合成带数量的组标记,点击组标记可展开查看单个位点。

修改后的完整代码:

#############################################
# Needed Libraries & Input Files

library(shiny)
library(shinydashboard)
library(leaflet)

## The Data
Point_ID = c("A1", "B1", "C1")
Latitude = c(38.00, 38.00, 38.00)
Longitude = c(-107.00, -107.00, -107.00)
Map_DF <- data.frame(Point_ID, Latitude, Longitude)

choiseList <- c("A1", "B1", "C1")

#############################################
# UI
ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(checkboxGroupInput(inputId = "IDPointInput", label = "Select Point ID", choices = choiseList, selected = choiseList)),
  dashboardBody(fluidRow(leafletOutput(outputId = 'mapA')))
)

#############################################
# SERVER
server <- function(input, output, session) {
  
  ## 过滤数据
  filter_df <- reactive({
    Map_DF[Map_DF$Point_ID %in% input$IDPointInput, ]
  })
  
  ## 初始化基础地图
  output$mapA <- renderLeaflet({
    leaflet() %>%
      addProviderTiles(
        providers$Esri.DeLorme,
        options = providerTileOptions(
          updateWhenZooming = FALSE,
          updateWhenIdle = TRUE)
      ) %>%
      setView(lng = -107.50, lat = 39.00, zoom = 7)
  })
  
  ## 根据选择更新聚类标记
  observe({
    leafletProxy("mapA", session) %>%
      clearMarkers() %>%
      addCircleMarkers(
        data = filter_df(),
        radius = 10,
        color = "red",
        lat = ~Latitude,
        lng = ~Longitude,
        popupOptions(autoPan = FALSE),
        popup = ~paste("PointID: ", Point_ID),
        # 启用标记聚类功能
        clusterOptions = markerClusterOptions()
      )
  })
}

############################################
shinyApp(ui = ui, server = server)

关键改动说明

  • 添加clusterOptions = markerClusterOptions()参数开启聚类功能
  • 重叠标记会被聚合成显示数量的组标记,直观展示该位置的重叠位点总数
  • 点击组标记可自动缩放地图并展开显示所有单个标记,点击单个标记仍可查看对应位点ID

内容的提问来源于stack exchange,提问作者rwjam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:40:34