如何用R基于3个地理空间文件(raster和shape)通过条件语句创建新raster图层
基于土地利用、土壤质地和碳值栅格生成基准栅格的解决方案
一、前置准备
- 安装并加载核心处理包:
install.packages("terra") library(terra) - 确认所有数据坐标系一致(你已说明满足此条件,可跳过验证;若需验证,可使用
crs(landuse)、crs(texture)查看)
二、读取空间数据
- 读取土地利用矢量(shapefile):
landuse <- vect("你的土地利用文件路径/landuse.shp") - 读取土壤质地栅格:
texture <- rast("你的土壤质地文件路径/texture.tif") - 读取土壤有机碳栅格:
carbon <- rast("你的碳值文件路径/carbon.tif")
三、生成目标区域掩码
只保留农田/草地对应的栅格区域,其余设为NA(假设土地利用字段名为land_type,类别值为"农田"、"草地"):
# 将矢量转为与碳值栅格匹配的栅格 land_mask <- rasterize(landuse, carbon, field = "land_type") # 过滤出目标土地利用类型,生成掩码 land_mask <- ifel(land_mask %in% c("农田", "草地"), 1, NA)
四、应用条件逻辑生成基准栅格
使用向量化条件判断(替代低效的循环)实现你的基准分配规则:
# 初始化结果栅格,默认值为NA new_raster <- carbon values(new_raster) <- NA # 质地为"light"的条件分支 new_raster <- ifel(land_mask == 1 & texture == "light" & carbon >= 0.68 & carbon <= 1.23, 1, new_raster) new_raster <- ifel(land_mask == 1 & texture == "light" & carbon > 1.23, 2, new_raster) # 质地为"middle I"的条件分支 new_raster <- ifel(land_mask == 1 & texture == "middle I" & carbon < 2.4, 0, new_raster) # 可继续添加其他质地和碳值的条件规则,格式同上
五、保存结果
将生成的基准栅格导出为tif文件:
writeRaster(new_raster, "输出文件路径/output_baseline.tif", overwrite = TRUE)
重要提示
- 避免用嵌套循环处理栅格:栅格数据通常包含数万甚至数百万像元,循环会导致处理速度极慢,
terra的向量化函数(如ifel)是底层优化实现,效率提升显著。 - 若土地利用的字段名、类别值与示例不同,需对应修改代码中的字符串。
- 可使用
plot(new_raster)快速可视化结果,验证规则是否正确应用。
内容的提问来源于stack exchange,提问作者user18791303
相关产品推荐
相关产品推荐

