python多波段影像读写的两种方法

python多波段影像写入tif的两种方法
1.## rasterio

t=0
Array = np.zeros((len(T_list)+2,280,644))
for ii in np.arange(0, len(T_list), 1):
    Tname = InPath + T_list[ii] + '.tif'

    with rasterio.open(Tname) as ds:
        print('---------------' + str(ii) + '--------------' + T_list[ii] + '--------------')
        print('该栅格数据的基本数据集信息(这些信息都是以数据集属性的形式表示的):')
        print(f'波段数目:{ds.count}')
        print(f'影像宽度:{ds.width}')
        print(f'影像高度:{ds.height}')
        print(f'地理范围:{ds.bounds}')

        if ii<=4:
            s=1
            t = t + 1
            A = ds.read([s])
            print(f'数组大小:{np.shape(A)}')
            Array[t - 1,:,:] = A
            print(f't:{t}')
        elif ii>=7:
            for s in np.arange(1, ds.count+1,1):
                print(f'波段:{s}')
                t = t + 1
                A = ds.read([s])
                print(f'数组大小:{np.shape(A)}')
                Array[t - 1, :, :] =A
                print(f't:{t}')
        else:
            t = t + 1
            ss=m
            A = ds.read([ss])
            print(f'数组大小:{np.shape(A)}')
            Array[t - 1,:,:]  = A
            print(f't:{t}')

print('---------------finish 数组合并--------------')
print(np.shape(Array))

"""
将输出的FSC另存为TIF文件,第一个参数为文件名
"""
#采用上面的地理信息,层数更新为10层
metadata = ds.meta
metadata.update({"count": 10})
with rasterio.open(InPath + '2020001_模型输入数据2.tif', "w", **metadata) as dt:
    for i in range(1,10+1,1):
        print('=====i:'+str(i))
        A=Array[i-1,:, :]
        print(A)
        print('A:'+ str(A.shape))
        band=i
        dt.write_band(i,A)
print('---------------finish 数组写入--------------')

注意:写入时循环一定要用【range】,否则会有误。

gdal

Array = np.zeros((280,644,len(T_list)+2))
for ii in np.arange(0, len(T_list), 1):
    Tname = InPath + T_list[ii] + '.tif'

    with rasterio.open(Tname) as ds:
        print('---------------' + str(ii) + '--------------' + T_list[ii] + '--------------')
        print('该栅格数据的基本数据集信息(这些信息都是以数据集属性的形式表示的):')
        print(f'波段数目:{ds.count}')
        print(f'影像宽度:{ds.width}')
        print(f'影像高度:{ds.height}')
        print(f'地理范围:{ds.bounds}')

        if ii<=4:
            s=1
            t = t + 1
            A = ds.read([s])
            print(f'数组大小:{np.shape(A)}')
            Array[:,:,t-1] = A
            print(f't:{t}')
        elif ii>=7:
            for s in np.arange(1, ds.count+1,1):
                print(f'波段:{s}')
                t = t + 1
                A = ds.read([s])
                print(f'数组大小:{np.shape(A)}')
                Array[:, :, t - 1] =A
                print(f't:{t}')
        else:
            t = t + 1
            ss=m
            A = ds.read([ss])
            print(f'数组大小:{np.shape(A)}')
            Array[:, :, t - 1]  = A
            print(f't:{t}')

print('---------------finish 数组合并--------------')
print(np.shape(Array))
print(type(Array))
"""
将输出的FSC另存为TIF文件,第一个参数为文件名
"""
#采用上面的地理信息,层数更新为10层
raster_file = InPath + 'SLOPE-0.05.tif'
new_file=InPath + '2020001_模型输入数据.tif'
dataset = gdal.Open(raster_file)
projection = dataset.GetProjection()
transform = dataset.GetGeoTransform()

driver = gdal.GetDriverByName('GTiff')
dst_ds = driver.Create(new_file, Array.shape[1], Array.shape[0], 10, gdal.GDT_Float32)

dst_ds.SetProjection(projection)
dst_ds.SetGeoTransform(transform)

for i in range(1,10+1,1):
    print('=====i:'+str(i))
    A=Array[:, :, i-1]
    print(A)
    print('A:'+ str(A.shape))
    # 将数组的各通道写入图片
    dst_ds.GetRasterBand(i).WriteArray(A)
dst_ds.FlushCache()
dst_ds = None
print('---------------finish 数组写入--------------')

注意:写入时循环一定要用【range】,否则会有误。

你可能感兴趣的:(python,numpy,开发语言)