#objective:将独立的栅格数据合并为一张影像,并保存输出。
#导入一个可以操作系统的库
import os
#导入GDAl库
from osgeo import gdal
#从系统中读取文件的目录,分别读取要和合并的波段
ds = os.chdir(r'G:TestData22')
b1 = 'LC81270392015294LGN00_B1.TIF'
b2 = 'LC81270392015294LGN00_B2.tif'
b3 = 'LC81270392015294LGN00_B3.tif'
#使用gdal库中的Open()方法打开一个波段,随后将打开的波段定义为输入的第一个波段
in_ds = gdal.Open(b1)
in_band = in_ds.GetRasterBand(1)
#GetDriverByName官网解释 Fetch a driver based on the short name.
#其实就是根据输入的GTiff确定类型,返回所支持类型的初始化结果(实例)。
gf_dv = gdal.GetDriverByName('GTiff')
#根据输入的内容,创建一个新的数据集,主要包括pszFilename 文件名、nXSize X轴像元数量、nYSize Y轴像元数量、nBands 波段数量、eType 栅格数据类型。
out_ds = gf_dv.Create('test2.tif',in_band.XSize,in_band.YSize,3,in_band.DataType)
#使用SetProjection()方法为新创建的数据集设置投影,与数据的波段投影相同。实际上,GetProjection()方法返回的一组字符串(string)
out_ds.SetProjection(in_ds.GetProjection())
#使用SetGeoTransform()设置变换参数(其实就是仿射变换的参数)
out_ds.SetGeoTransform(in_ds.GetGeoTransform())
#将打开的波段读取为数组,从输入波段复制每个像元到输出波段3
in_data = in_band.ReadAsArray()
out_band = out_ds.GetRasterBand(3)
out_band.WriteArray(in_data)
#从数据集复制数据,以数组的形式写入到输出数据集中
in_ds = gdal.Open(b2)
out_band = out_ds.GetRasterBand(2)
out_band.WriteArray(in_ds.ReadAsArray())
#了解过程后对上面两种写法的简化
out_ds.GetRasterBand(1).WriteArray(gdal.Open(b3).ReadAsArray())
#将所有的数据写入磁盘
out_ds.FlushCache()
#ComputeStatistics()方法可计算统计数据,返回最大值,最小值,平均值和标准差
for i in range(1,4):
out_ds.GetRasterBand(i).ComputeStatistics(True)
del out_ds
其实总结下来学会这几句就够了:
gf_dv = gdal.GetDriverByName('GTiff')
out_ds = gf_dv.Create('test2.tif',in_band.XSize,in_band.YSize,3,in_band.DataType)
out_ds.SetProjection(in_ds.GetProjection())
out_ds.SetGeoTransform(in_ds.GetGeoTransform())
out_ds.GetRasterBand(1).WriteArray(gdal.Open(b3).ReadAsArray())
out_ds.FlushCache()



