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

合并两个空间对象ID,创建加泰罗尼亚市镇人口分级统计图

制作可复现的加泰罗尼亚市镇人口分级统计图

嘿,结合你已经完成的导入和坐标系匹配步骤,我来帮你把后续的流程补全,确保整个分析完全可复现:

一、回顾已完成的基础步骤

你已经搞定了数据下载和初步导入,这里把完整的导入+坐标系对齐代码补全:

# 提前安装依赖包:install.packages(c("rgdal", "sf", "ggplot2", "tmap"))
library(rgdal)

# 导入人口数据(替换"location"为你的文件实际存放路径)
catapop <- readOGR("location", "rp2016_qtree_level2_ofus_allvar")

# 导入市镇边界数据(替换"boundary_path"为你的边界文件路径)
cata_bound <- readOGR("boundary_path", "bseccenv10sh1f1_2002a2016_0")

# 统一坐标系(用人口数据的CRS对齐边界数据)
cata_bound <- spTransform(cata_bound, CRS(proj4string(catapop)))

二、关联人口数据与边界数据

这一步是核心,需要找到两个数据集的共同标识符(比如市镇编码,通常是类似COD_MUNICIPI的字段)。先查看两个数据集的字段名确认:

# 查看人口数据的字段列表
names(catapop@data)
# 查看边界数据的字段列表
names(cata_bound@data)

假设共同匹配字段是COD_MUNICIPI,执行数据合并:

# 合并空间数据(保留所有边界,匹配对应人口数据)
cata_combined <- merge(cata_bound, catapop@data, by = "COD_MUNICIPI", all.x = TRUE)

# 检查是否有缺失的人口数据(可选但重要)
sum(is.na(cata_combined$POPULATION)) # 替换成你实际的人口数值字段名

三、绘制分级统计图

推荐两种主流方法,选你顺手的就行:

方法1:用ggplot2 + sf(现代空间绘图首选)

把sp对象转成sf格式,绘图灵活性更高:

library(sf)
library(ggplot2)

# 将合并后的sp对象转换为sf格式
cata_sf <- st_as_sf(cata_combined)

# 绘制分级填充地图
ggplot(cata_sf) +
  # 绘制市镇多边形,填充色绑定人口数据
  geom_sf(aes(fill = POPULATION), color = "#ffffff", size = 0.1) +
  # 选用色盲友好的viridis配色
  scale_fill_viridis_c(option = "magma", name = "2016年人口数", 
                       breaks = scales::breaks_pretty(n = 5)) +
  # 添加标题和数据来源标注
  labs(title = "加泰罗尼亚市镇人口分布(2016)",
       subtitle = "分级统计图",
       caption = "数据来源:IDESCAT & ICC") +
  # 去除多余的坐标轴和网格,优化视觉效果
  theme_minimal() +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )

方法2:用tmap(快速绘制专业地图)

tmap专门针对空间数据设计,代码更简洁高效:

library(tmap)
library(RColorBrewer)

# 设置分级配色方案
pop_pal <- brewer.pal(6, "YlGnBu")

# 绘制地图
tm_shape(cata_combined) +
  tm_polygons("POPULATION", 
              palette = pop_pal, 
              title = "2016年人口数",
              border.col = "white",
              border.lwd = 0.1) +
  tm_layout(
    title = "加泰罗尼亚市镇人口分布",
    title.position = c("center", "top"),
    legend.position = c("right", "bottom"),
    frame = FALSE,
    inner.margins = c(0.02, 0.02, 0.02, 0.02)
  )

四、常见坑点排查

  • 合并后缺失值多:检查两个数据集的市镇编码是否完全匹配,比如是否有大小写差异、多余空格,必要时用trimws()清理字符串字段
  • 坐标系不匹配报错:用proj4string(catapop)和proj4string(cata_bound)确认CRS字符串完全一致,若不一致手动指定正确的CRS
  • 绘图时边界显示不全:检查Shapefile是否完整导入,确保所有关联文件(.shp/.shx/.dbf等)都在同一目录下

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:57:36