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

R语言合并空间多边形DataFrame生成Leaflet地图遇NA问题求助

解决GADM空间数据与统计DataFrame合并后字段NA问题并生成Leaflet交互式地图

1. 问题根源定位

合并后Mean_Rate等字段全为NA,核心原因是空间数据的NAME_1/NAME_2与统计数据的State/Geography没有匹配成功,常见触发场景:

  • 大小写不一致(如GADM存"Los Angeles",你的数据是"los angeles")
  • 州名格式差异(GADM用全称"California",你的数据用缩写"CA")
  • 郡名后缀/别名差异(如GADM带"County"后缀,你的数据仅存郡名)
  • 字符串含多余空格(如"San Diego " vs "San Diego")

匹配检查代码

先确认双方键值的差异:

# 提取GADM中的加州数据
gadm_ca <- subset(gadm_data, NAME_1 == "California")

# 对比双方键值
head(gadm_ca[, c("NAME_1", "NAME_2")])
head(your_data[, c("State", "Geography")])

# 找出完全不匹配的项
setdiff(gadm_ca$NAME_2, your_data$Geography)  # GADM有但统计数据无的郡名
setdiff(your_data$Geography, gadm_ca$NAME_2)  # 统计数据有但GADM无的郡名

2. 清洗合并键,统一格式

根据检查结果,对键值做标准化处理:

library(stringr)

# 统一大小写
your_data$State <- toupper(your_data$State)
gadm_ca$NAME_1 <- toupper(gadm_ca$NAME_1)
your_data$Geography <- str_to_title(your_data$Geography)
gadm_ca$NAME_2 <- str_to_title(gadm_ca$NAME_2)

# 去除首尾空格
your_data$Geography <- trimws(your_data$Geography)
gadm_ca$NAME_2 <- trimws(gadm_ca$NAME_2)

# 州名缩写转全称(如果你的数据用缩写)
state_map <- c("CA" = "CALIFORNIA")
your_data$State <- recode(your_data$State, !!!state_map)

# 给统计数据的郡名补全"County"后缀(如果GADM带后缀)
your_data$Geography <- paste0(your_data$Geography, " County")

3. 重新执行空间合并

推荐使用sf包(当前空间数据处理的主流工具,比sp更易用):

library(sf)

# 转换GADM数据为sf格式
gadm_ca_sf <- st_as_sf(gadm_ca)

# 执行合并
merged_sf <- merge(gadm_ca_sf, your_data, 
                   by.x = c("NAME_1", "NAME_2"), 
                   by.y = c("State", "Geography"))

如果坚持用sp包:

merged_sp <- sp::merge(gadm_ca, your_data, 
                       by.x = c("NAME_1", "NAME_2"), 
                       by.y = c("State", "Geography"))

4. 生成Leaflet交互式地图

基于合并后的sf对象,生成带指标弹窗的交互式地图:

library(leaflet)
library(RColorBrewer)

# 定义颜色渐变方案
pal <- colorNumeric(palette = "YlOrRd", domain = merged_sf$Mean_Rate)

# 构建地图
leaflet(merged_sf) %>%
  addTiles() %>%  # 添加默认底图
  addPolygons(
    fillColor = ~pal(Mean_Rate),
    fillOpacity = 0.7,
    color = "#BDBDC3",
    weight = 1,
    popup = ~paste0(
      "<strong>郡名:</strong> ", NAME_2, "<br>",
      "<strong>平均比率:</strong> ", round(Mean_Rate, 2), "<br>",
      "<strong>分子均值:</strong> ", Mean_Numerator, "<br>",
      "<strong>分母均值:</strong> ", Mean_Denominator
    )
  ) %>%
  addLegend(
    pal = pal,
    values = ~Mean_Rate,
    title = "Mean Rate",
    position = "bottomright"
  )

额外提示

  • 如果仍有少量NA,说明存在个别郡名别名差异,手动添加映射规则即可
  • 确保getData获取的GADM数据为最新版本,避免行政区划变更导致的不匹配
  • sf包支持更多现代空间数据操作,建议逐步迁移到sf生态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:25:54