批量裁剪多通道数据 gdal

import os
from osgeo import gdal

inPath = "./dataset/sat_train/"
outPath = "./dataset/train/"


for f in os.listdir(inPath):
# 读取要切的原图
    imgPath=inPath+f.strip()
    in_ds = gdal.Open(imgPath)
    print(f.strip()+"open tif file succeed")
    width = in_ds.RasterXSize  # 获取数据宽度
    height = in_ds.RasterYSize  # 获取数据高度
    outbandsize = in_ds.RasterCount # 获取数据波段数
    # im_geotrans = in_ds.GetGeoTransform() # 获取仿射矩阵信息
    # im_proj = in_ds.GetProjection()  # 获取投影信息
    datatype = in_ds.GetRasterBand(1).DataType
    im_data = in_ds.ReadAsArray()  # 获取数据

    # 读取原图中的每个波段
    in_band1 = in_ds.GetRasterBand(1)
    in_band2 = in_ds.GetRasterBand(2)
    in_band3 = in_ds.GetRasterBand(3)
    in_band4 = in_ds.GetRasterBand(4)

    # 定义切图的起始点坐标
    offset_x = 0
    offset_y = 0

    # 定义切图的大小(矩形框)
    block_xsize = 1024 # 行
    block_ysize = 1024 # 列


    k = 0
    for j in range(width // block_xsize):
        for i in range(height // block_xsize):
            out_band1 = in_band1.ReadAsArray(i * block_xsize, j * block_xsize, block_xsize, block_ysize)
            out_band2 = in_band2.ReadAsArray(i * block_xsize, j * block_xsize, block_xsize, block_ysize)
            out_band3 = in_band3.ReadAsArray(i * block_xsize, j * block_xsize, block_xsize, block_ysize)
            out_band4 = in_band4.ReadAsArray(i * block_xsize, j * block_xsize, block_xsize, block_ysize)
            # print(out_band3)
            k += 1
            # 获取Tif的驱动,为创建切出来的图文件做准备
            gtif_driver = gdal.GetDriverByName("GTiff")


            # 创建切出来的要存的文件(3代表3个不都按,最后一个参数为数据类型,跟原文件一致)
            filename = outPath + f.strip()[:-4] + '({},{})@{:05d}_sat.tif'.format(j, i, k)  # 文件名称
            out_ds = gtif_driver.Create(filename, block_xsize, block_ysize, outbandsize, datatype)
            # print("create new tif file succeed")

            # 写入目标文件
            out_ds.GetRasterBand(1).WriteArray(out_band1)
            out_ds.GetRasterBand(2).WriteArray(out_band2)
            out_ds.GetRasterBand(3).WriteArray(out_band3)
            out_ds.GetRasterBand(4).WriteArray(out_band4)

            # 将缓存写入磁盘
            out_ds.FlushCache()
            del out_ds
    print("FlushCache succeed")
print("End!")

猜你喜欢

转载自blog.csdn.net/weixin_61235989/article/details/129178474