如何在R语言中基于双栅格数据实现人口栅格的条件分类?
R语言栅格条件分类实现方案
你的需求是基于人口和夜间灯光栅格,将满足条件的区域分为两类:
- 类别1:人口>1 且 夜间灯光≥20
- 类别2:人口>1 且 夜间灯光<20
原代码的问题
- 错误地使用字符串(
'pop'、'ntl')进行数值比较,实际应该调用栅格对象的数值 - 用单值判断的
if语句处理栅格,无法实现逐单元格的批量条件赋值
正确实现代码
步骤1:加载并预处理数据
library(raster) # 加载栅格文件 ntl <- raster("path/ntl_atprk.tif") pop <- raster("path/pop.tif") # 将人口栅格重采样至夜间灯光栅格的分辨率/投影 pop_resampled <- resample(pop, ntl, method = 'bilinear')
步骤2:创建分类栅格(两种方法可选)
方法一:直接索引赋值(高效直观)
# 初始化与ntl同范围的空栅格,默认值为NA classified_raster <- raster(ntl) classified_raster[] <- NA # 给满足条件A的单元格赋值1 classified_raster[pop_resampled > 1 & ntl >= 20] <- 1 # 给满足条件B的单元格赋值2 classified_raster[pop_resampled > 1 & ntl < 20] <- 2
方法二:使用calc函数(适合复杂多条件场景)
# 合并两个栅格为栈,传入calc函数进行逐单元格计算 classified_raster <- calc(stack(pop_resampled, ntl), function(cell_vals) { pop_val <- cell_vals[1] ntl_val <- cell_vals[2] # 跳过NA值 if (is.na(pop_val) || is.na(ntl_val)) { return(NA) } # 条件判断赋值 if (pop_val > 1 && ntl_val >= 20) { return(1) } else if (pop_val > 1 && ntl_val < 20) { return(2) } else { return(NA) } })
可选:保存结果栅格
# 将分类后的栅格保存为tif文件 writeRaster(classified_raster, "path/classified_pop_ntl.tif", format = "GTiff", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

