批量对齐栅格数据代码

学术   2024-11-15 23:22   北京  

批量对齐栅格数据代码

最近经常遇到把一个栅格数据对齐到另外一个栅格数据。

经常会遇到同一个区域的几个栅格数据的分辨率、行列号和投影都不一致。

那可以用gdal和rasterio来实现。代码如下:

import rasterio
from rasterio.warp import reproject, Resampling
import os

def align_raster(input_path, reference_path, output_path):
    """
    将输入栅格对齐到参考栅格
    """

    try:
        # 读取参考栅格获取目标参数
        with rasterio.open(reference_path) as src2:
            dst_crs = src2.crs
            dst_transform = src2.transform
            dst_width = src2.width
            dst_height = src2.height

        # 对输入栅格进行重投影和重采样
        with rasterio.open(input_path) as src1:
            # 准备输出元数据
            meta = src1.meta.copy()
            meta.update({
                'crs': dst_crs,
                'transform': dst_transform,
                'width': dst_width,
                'height': dst_height
            })
            
            # 创建输出文件并进行重投影
            with rasterio.open(output_path, 'w', **meta) as dst1:
                for i in range(1, src1.count + 1):
                    reproject(
                        source=rasterio.band(src1, i),
                        destination=rasterio.band(dst1, i),
                        src_transform=src1.transform,
                        src_crs=src1.crs,
                        dst_transform=dst_transform,
                        dst_crs=dst_crs,
                        resampling=Resampling.bilinear
                    )
        print(f"已保存对齐后的栅格: {output_path}")
        return True

    except Exception as e:
        print(f"处理文件 {input_path} 时发生错误: {str(e)}")
        return False

def main():
    # 定义输入输出路径
    input_dir = r'你的文件夹路径'
    output_dir = r'输出路径'
    reference_path = r'参考栅格的tif'

    # 确保输出目录存在
    os.makedirs(output_dir, exist_ok=True)

    # 获取所有tif文件
    tif_files = [f for f in os.listdir(input_dir) if f.endswith('.tif')]
    total_files = len(tif_files)
    
    print(f"共找到 {total_files} 个TIF文件需要处理")

    # 处理每个文件
    successful = 0
    failed = 0
    
    for i, tif_file in enumerate(tif_files, 1):
        input_path = os.path.join(input_dir, tif_file)
        output_path = os.path.join(output_dir, tif_file)
        
        print(f"\n处理第 {i}/{total_files} 个文件: {tif_file}")
        
        if align_raster(input_path, reference_path, output_path):
            successful += 1
        else:
            failed += 1

    # 打印处理结果统计
    print("\n处理完成:")
    print(f"成功处理: {successful} 个文件")
    print(f"处理失败: {failed} 个文件")
    print(f"总计文件: {total_files} 个")

    # 验证最后一个处理的文件
    if successful > 0:
        print("\n验证最后处理的文件:")
        with rasterio.open(output_path) as aligned1, rasterio.open(reference_path) as src2:
            print(f"参考栅格大小: {src2.width} x {src2.height}")
            print(f"对齐后栅格大小: {aligned1.width} x {aligned1.height}")
            print(f"参考栅格变换矩阵: {src2.transform}")
            print(f"对齐后变换矩阵: {aligned1.transform}")
            
            if (aligned1.transform == src2.transform and 
                aligned1.width == src2.width and 
                aligned1.height == src2.height):
                print("栅格已成功对齐到参考栅格的网格和分辨率")
            else:
                print("对齐结果有误,请检查")

if __name__ == "__main__":
    main()

环境:python 3.10 ,安装gdal和rasterio包。

原理是:

  • 读取参考栅格,获取目标参数:
    • 坐标系统(CRS)
    • 变换矩阵(transform)
    • 影像宽度和高度
  • 对每个输入栅格文件:
    • 读取源文件
    • 更新元数据(metadata)
    • 使用双线性重采样方法进行重投影
    • 保存对齐后的文件

注:该代码由chatgpt o1一次性生成,生成后就可以直接运行,没有报错。感叹一下,太强了。


锐多宝
锐多宝的地理空间 原名:遥感之家
 最新文章