#数据降尺度
#首先下载了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结果:
没有问题了!再去重复前面的代码步骤即可~~