cmip数据提取并降尺度修订【20250326-20250408】

#数据降尺度

#首先下载了Panoply.exe可以看nc的数据分布,具体操作参考如下:安装并使用Panoply (netCDF, HDF and GRIB Data Viewer)_netcdf viewer-优快云博客

查看了我的研究区转成nc的结果:

#另外安装了ubantu 准备进行裁剪,具体的方法见如下网页

利用gdal+cdo+shp将全球范围的nc文件裁剪为中国大陆区域 - 知乎

这个网址的代码不是很详细,于是进行补充

输入cdo 的代码如下:

最终代码:

#!/bin/bash

set -e  # 报错时自动退出



input_dir="/mnt/f/CMIP6/r1i1p1f1"

output_dir="/mnt/f/CMIP6/CanESM5"

mask_file="/mnt/f/CMIP6/remap_xinjiang.nc"



# 检查 cdo 是否安装

if ! command -v cdo &> /dev/null; then

    echo "Error: cdo not found. Install with: sudo apt-get install cdo"

    exit 1

fi



# 检查掩膜文件是否存在

if [ ! -f "$mask_file" ]; then

    echo "Error: Mask file $mask_file not found."

    exit 1

fi



# 遍历处理文件

for input_file in "$input_dir"/*.nc; do

    filename=$(basename "$input_file")

   

    if [ ! -f "$input_file" ]; then

        echo "File $input_file does not exist. Skipping."

        continue

    fi



    # 步骤1: 重映射到经纬度网格

    remapped_file="$output_dir/remap_$filename"

    echo "Remapping: $filename → remap_$filename"

    cdo -f nc remapbil,r320x160 "$input_file" "$remapped_file"



    # 步骤2: 区域裁剪(使用重映射后的文件!)

    output_file="$output_dir/xinjiang_$filename"

    echo "Clipping: remap_$filename → xinjiang_$filename"

    cdo ifthen "$mask_file" "$remapped_file" "$output_file"



    # 检查输出文件

    if [ -f "$output_file" ]; then

        echo "Success: $filename processed."

    else

        echo "Error: Failed to process $filename."

    fi

done



echo "All tasks completed!"

有的文件是hdf,因此先将hdf变成nc:

代码如下:

#!/bin/bash
# 批量HDF转NC脚本 v1.2
# 配置区 ==============================
INPUT_DIR="/mnt/f/CMIP6"       # HDF输入目录
OUTPUT_DIR="/mnt/f/CMIP6/hdf"      # NC输出目录
LOG_FILE="hdf2nc.log"         # 日志文件路径
CDO_OPTS="-f nc4 -z zip_5"  # 使用DEFLATE压缩替代szip‌:ml-citation{ref="3,7" data="citationList"}
      # 压缩参数(nc4格式+压缩)
# =====================================

# 初始化环境
mkdir -p "$OUTPUT_DIR"
echo "$(date) 批量转换开始" | tee -a "$LOG_FILE"

# 主循环处理
for hdf in "$INPUT_DIR"/*.hdf; do
    filename=$(basename "$hdf" .hdf)
    nc_file="$OUTPUT_DIR/${filename}.nc"
    
    # 跳过已存在文件
    if [ -f "$nc_file" ]; then
        echo "跳过已存在文件: $nc_file" | tee -a "$LOG_FILE"
        continue
    fi

    # 执行转换
    echo "正在处理: $hdf → $nc_file" | tee -a "$LOG_FILE"
    # 修改后的执行段(使用进程替换保存真实退出码)
    {
    cdo $CDO_OPTS copy "$hdf" "$nc_file" 2>&1 
    echo "cdo_exit_code=$?" 
    } | tee -a "$LOG_FILE"

    # 提取真实退出码
    exit_code=$(grep 'cdo_exit_code=' "$LOG_FILE" | tail -1 | cut -d= -f2)
    if [ "$exit_code" -eq 0 ]; then
        echo "[成功] $filename" | tee -a "$LOG_FILE"
    else
        echo "[失败] $filename (错误码: $exit_code)" | tee -a "$LOG_FILE"
        rm -f "$nc_file" 2>/dev/null
    fi

done

echo "$(date) 批量转换完成" | tee -a "$LOG_FILE"

然后打开检查一下数值和分布

nc结果:

hdf结果:

没有问题了!再去重复前面的代码步骤即可~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值