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

如何在R的leaflet地图上用不同图标展示两个数据集

问题:Leaflet地图无法同时展示两个地理数据集标记

需要在同一地图上用不同图标可视化两个数据集做对比,但添加第二个数据集后地图显示异常,控制台无报错但标记无法正常展示。

数据集结构

data_a前6行

structure(list(Nr = c(1, 2, 3, 4, 5, 6), Name = c("MD95-2006", "IODP 302", "IODP 302", "IODP 302", "IODP 302", "IODP 302"), Lat = c(57.083333, 87.89, 87.9036, 87.92118, 87.93333, 87.86658), Long = c(-8.05, 137.65, 138.46065, 139.365501, 139.535, 136.17735), `18O` = c(0.69, NA, NA, NA, NA, NA), Info = c(NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), Source = c("MD95-2006 planktic foraminifera ?13C and ?18O", "https://www.ecord.org/expedition302/", "https://www.ecord.org/expedition302/", "https://www.ecord.org/expedition302/", "https://www.ecord.org/expedition302/", "https://www.ecord.org/expedition302/")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

data_b前6行

structure(list(Nr = c(1, 2, 3, 4, 5, 6), Name = c("Simstich", "Schiebel", "Schiebel", "Stangeew", "Stangeew", "Stangeew"), Lat = c(75.003333, 62.50275, 67.225033, 56.2747, 53.4347, 52.874), Long = c(-7.313333, -13.99235, 2.920317, -48.6992, -50.0673, -51.5128), `18O` = c(NA, NA, NA, NA, NA, NA), Info = c("data for different depths", NA, NA, NA, NA, NA), Source = c("https://doi.pangaea.de/10.1594/PANGAEA.82001?format=html#download", "https://doi.pangaea.de/10.1594/PANGAEA.75647?format=html#download", "https://doi.pangaea.de/10.1594/PANGAEA.75719", "https://doi.pangaea.de/10.1594/PANGAEA.706908", "https://doi.pangaea.de/10.1594/PANGAEA.706908", "https://doi.pangaea.de/10.1594/PANGAEA.706908")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

现有可正常显示单个数据集的代码

install.packages('readxl')
install.packages('leaflet')
library(leaflet)
library(readxl)

data_a <- read_excel('C:/Users/Location_map.xlsx', sheet = 'Core_Tops')
data_b <- read_excel('C:/Users/Location_map.xlsx', sheet = 'Tows')
dput(head(data_a))
dput(head(data_b))

lat_a <- data_a$Lat
lon_a <- data_a$Long
lat_b <- data_b$Lat
lon_b <- data_b$Long

map <- leaflet() %>%
  addTiles() %>%
  addMarkers(lng = lon_a, lat = lat_a) 

print(map)

异常代码(添加第二个数据集后)

map <- leaflet() %>%
  addTiles() %>%
  addMarkers(lng = lon_a, lat = lat_a)%>%
  addMarkers(lng = lon_b, lat = lat_b)
print(map)

解决方案

1. 清理缺失数据

首先检查两个数据集的经纬度是否存在NA值,Leaflet会跳过含缺失值的标记,大量缺失可能导致渲染异常:

# 检查data_a的经纬度缺失数量
sum(is.na(data_a$Lat) | is.na(data_a$Long))
# 检查data_b的经纬度缺失数量
sum(is.na(data_b$Lat) | is.na(data_b$Long))

如果存在缺失值,用na.omit()清理:

data_a_clean <- na.omit(data_a[, c("Lat", "Long", "Name", "Source")])
data_b_clean <- na.omit(data_b[, c("Lat", "Long", "Name", "Info", "Source")])

2. 使用自定义图标区分数据集

直接调用两次addMarkers会使用默认图标,且可能因图层覆盖导致显示问题,为每个数据集设置独特图标:

# 定义data_a的图标
icon_core <- makeIcon(
  iconUrl = "https://cdn-icons-png.flaticon.com/512/103/103599.png",
  iconWidth = 30, iconHeight = 30,
  iconAnchorX = 15, iconAnchorY = 30 # 图标锚点,确保点击位置准确
)

# 定义data_b的图标
icon_tow <- makeIcon(
  iconUrl = "https://cdn-icons-png.flaticon.com/512/103/103600.png",
  iconWidth = 30, iconHeight = 30,
  iconAnchorX = 15, iconAnchorY = 30
)

# 创建地图并添加两个数据集的标记
map <- leaflet() %>%
  addTiles() %>%
  addMarkers(
    data = data_a_clean,
    lng = ~Long, lat = ~Lat,
    icon = icon_core,
    popup = paste0("<strong>名称:</strong>", data_a_clean$Name, "<br><strong>来源:</strong>", data_a_clean$Source)
  ) %>%
  addMarkers(
    data = data_b_clean,
    lng = ~Long, lat = ~Lat,
    icon = icon_tow,
    popup = paste0("<strong>名称:</strong>", data_b_clean$Name, "<br><strong>信息:</strong>", data_b_clean$Info, "<br><strong>来源:</strong>", data_b_clean$Source)
  )

print(map)

3. 添加图层控制(可选)

如果需要切换显示两个数据集,添加图层控制功能:

map <- leaflet() %>%
  addTiles() %>%
  addMarkers(
    data = data_a_clean,
    lng = ~Long, lat = ~Lat,
    icon = icon_core,
    popup = paste0("<strong>名称:</strong>", data_a_clean$Name, "<br><strong>来源:</strong>", data_a_clean$Source),
    group = "Core Tops"
  ) %>%
  addMarkers(
    data = data_b_clean,
    lng = ~Long, lat = ~Lat,
    icon = icon_tow,
    popup = paste0("<strong>名称:</strong>", data_b_clean$Name, "<br><strong>信息:</strong>", data_b_clean$Info, "<br><strong>来源:</strong>", data_b_clean$Source),
    group = "Tows"
  ) %>%
  addLayersControl(
    overlayGroups = c("Core Tops", "Tows"),
    options = layersControlOptions(collapsed = FALSE)
  )

print(map)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:34:52