如何在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
相关产品推荐
相关产品推荐

