如何基于县级普查数据批量校正人口栅格数据集?
批量校正人口栅格的高效实现方法
不用逐个处理区县再合并,直接通过分区统计+栅格化校正因子的方式就能一次性完成校正,大幅提升效率,以下是具体实现:
核心思路
- 一次性计算每个区县对应的WorldPop栅格人口总和
- 用区县普查人口除以栅格总和得到校正因子
- 将校正因子栅格化(匹配原人口栅格的分辨率/范围)
- 原人口栅格与校正因子栅格相乘,得到最终校正结果
方法一:用terra包快速实现(推荐)
terra是当前R中处理栅格/矢量数据的高效工具,速度远优于旧版raster包:
# 加载包 library(terra) # 读入数据(替换为你的文件路径) pop_rast <- rast("city_population.tif") # 已裁剪好的城市人口栅格 county_shp <- vect("county_boundaries.shp") # 县级行政边界 # 确保矢量与栅格投影一致(若已处理过可跳过) county_shp <- project(county_shp, crs(pop_rast)) # 1. 计算每个区县的WorldPop栅格人口总和 zonal_stats <- zonal(pop_rast, county_shp, fun = "sum", na.rm = TRUE) # 2. 给边界矢量添加校正因子字段 county_shp$correction_factor <- county_shp$census_data / zonal_stats$sum # 3. 将校正因子栅格化,匹配原人口栅格的参数 correction_rast <- rasterize(county_shp, pop_rast, field = "correction_factor") # 4. 生成校正后的人口栅格 corrected_pop_rast <- pop_rast * correction_rast
方法二:用exactextractr实现高精度校正
如果区县边界与栅格不完全对齐(比如不规则边界),exactextractr的精确提取能避免统计误差:
# 加载包 library(exactextractr) library(dplyr) library(terra) # 读入数据 pop_rast <- rast("city_population.tif") county_shp <- vect("county_boundaries.shp") county_shp <- project(county_shp, crs(pop_rast)) # 1. 精确提取每个区县的栅格人口总和 zonal_sum <- exact_extract(pop_rast, county_shp, fun = "sum", na.rm = TRUE) county_df <- as.data.frame(county_shp) %>% mutate(worldpop_sum = zonal_sum, correction_factor = census_data / worldpop_sum) # 2. 栅格化校正因子 correction_rast <- rasterize(county_shp, pop_rast, field = county_df$correction_factor) # 3. 校正人口栅格 corrected_pop_rast <- pop_rast * correction_rast
为什么这个方法更高效?
- 避免了循环裁剪单个区县的重复IO操作,一次性完成分区统计
- 栅格化校正因子后直接逐像元相乘,无需合并多个子栅格
- 无论是
terra还是exactextractr都做了底层优化,处理大栅格时速度优势明显
内容的提问来源于stack exchange,提问作者Wei Liao
相关产品推荐
相关产品推荐

