批量将多个tif数据合并成一个tif

在项目中往往需要将一个文件夹中的所有tif进行融合成一个tif,这里实现一个批处理,具体代码如下:

#哨兵数据波段融合
import numpy as np
import gdal
import os
import sys
import importlib
importlib.reload(sys)
# sys.setdefaultencoding('utf8')、

#--------------------------------------------------------
#需要修改的变量
path = r"F:\test\output"  #Acolite大气校正后结果路径
outtif = r"F:\test\output2" #输出文件路径
#--------------------------------------------------------

def numtifs_to_tif(tifDir,outtif):
    NP2GDAL_CONVERSION = {
      "uint8": 1,
      "int8": 1,
      "uint16": 2,
      "int16": 3,
      "uint32": 4,
      "int32": 5,
      "float32": 6,
      "float64": 7,
      "complex64": 10,
      "complex128": 11,
    }
    tifs = [i for i in os.listdir(tifDir) if i.endswith(".tif") and i.split('_')[9]=="Rrs"]
    #获取投影波段数等信息
    bandsNum = len(tifs)
    dataset = gdal.Open(os.path.join(tifDir,tifs[0]))
    projinfo = dataset.GetProjection()
    geotransform = dataset.GetGeoTransform()
    cols,rows=dataset.RasterXSize,dataset.RasterYSize
    datatype=dataset.GetRasterBand(1).ReadAsArray(0,0,1,1).dtype.name
    gdaltype=NP2GDAL_CONVERSION[datatype]
    dataset=None
    #创建目标文件
    format = "GTiff" #tif格式
    format = "ENVI"  # ENVI格式
    driver = gdal.GetDriverByName(format)
    dst_ds = driver.Create(outtif+"\\"+tifDir.split('\\')[-1]+'RH.tif',cols, rows,bandsNum, gdaltype)
    dst_ds.SetGeoTransform(geotransform)
    dst_ds.SetProjection(projinfo)
    #写入文件
    info = set()
    for k in range(bandsNum):
        ds = gdal.Open(os.path.join(tifDir,tifs[k]))
        X,Y = ds.RasterXSize,ds.RasterYSize
        info.add("%s,%s"%(X,Y))
        if(len(info) != 1):
            dst_ds = None
            ds = None
            print("%s 列数行数不一样:%s,%s"%(tifs[k],X,Y))
            raise Exception("有影像行列数不一致")
        data = ds.GetRasterBand(1).ReadAsArray()    ##读取第一波段
        ds = None
        dst_ds.GetRasterBand(k+1).WriteArray(data)
        dst_ds.GetRasterBand(k+1).SetDescription("hahha_%s"%k)
        print("波段 %s ==> 文件 %s"%(k+1,tifs[k]))
    dst_ds = None
for root,dirs,files in os.walk(path):
    if root!=path:
        print(root)
        numtifs_to_tif(root,outtif)

 

你可能感兴趣的:(GIS)