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!")
批量裁剪多通道数据 gdal
于 2023-02-23 11:59:07 首次发布