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

如何在R语言中基于双栅格数据实现人口栅格的条件分类?

R语言栅格条件分类实现方案

你的需求是基于人口和夜间灯光栅格,将满足条件的区域分为两类:

  • 类别1:人口>1 且 夜间灯光≥20
  • 类别2:人口>1 且 夜间灯光<20

原代码的问题

  1. 错误地使用字符串('pop'、'ntl')进行数值比较,实际应该调用栅格对象的数值
  2. 用单值判断的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:06:29