本文介绍基于
C++
语言
GDAL
库,为
CreateCopy()
函数创建的栅格图像
添加
更多波段
的方法。


C++
语言的
GDAL
库中,我们可以基于
CreateCopy()
函数与
Create()
函数创建新的栅格图像文件。其中,
CreateCopy()
函数需要基于一个
已有的栅格图像文件
作为模板,将模板文件的各项属性信息(例如空间参考信息、像元个数、像元大小、波段数量等),自动作为
新创建的栅格图像文件
的属性信息;而
Create()
函数则是仅仅新建立一个栅格图像,需要我们自行定义新栅格图像的各类属性信息。

因此,一般我们选择
CreateCopy()
函数来创建栅格图像文件较为方便,因为其不需要我们手动为所创建的栅格图像配置各种属性信息;但是有时我们希望所创建的
新的栅格图像
,其与
作为模板的图像
之间的属性有一定差异。例如,我们现在依据一个具有
1
个波段的
.tif
格式的模板图像,创建一个新的
.tif
格式的图像;而我们需要使得新的图像具有
3
个波段,除此之外其他属性信息与模板图像一致。这就需要我们在调用
CreateCopy()
函数之后,进行一些额外的操作。

首先,
GDAL
库提供了
AddBand()
函数,可以为
GDALDataset*
类型的数据添加波段;但是,
AddBand()
函数
对于大部分格式的栅格图像而言都不起作用
——例如,最常见的
.tif
格式的栅格图像文件,其就不支持利用
AddBand()
函数增添自身的波段数量。大家在实践过程中,如果用的是其他格式的栅格图像文件,可以先直接用
AddBand()
函数尝试一下,看看其对于自己当前格式的数据是否有效;如果没有效果的话,就需要用接下来的方法来实现需求了。

整体思路其实也很简单——我们在依据
.tif
格式的
模板栅格图像文件
创建新的
.tif
格式的
栅格图像文件
前,先建立一个
.vrt
格式的文件。
.vrt
格式文件是
GDAL
库中提供的一种
虚拟数据格式
,这一数据格式的详细介绍大家可以参考
GDAL
库的帮助文档,这里我们就不再详细说明了;目前只需要知道,
.vrt
格式文件是支持利用
AddBand()
函数增添自身的波段数量的。随后,我们为
.vrt
格式文件增添波段,再用
CreateCopy()
函数基于这一
.vrt
格式文件创建新的
.tif
格式的栅格图像文件,从而实现我们的需求。

	const char* pszFormat = "GTiff";
	GDALDriver* poDriver, * poDriver_VRT;
	poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
	poDriver_VRT = GetGDALDriverManager()->GetDriverByName("VRT");
	GDALDataset* poSrcDS = (GDALDataset*)GDALOpenShared(mod_file.c_str(), GA_ReadOnly);
	GDALDataset* poVRTDS = poDriver_VRT->CreateCopy(mod_file.replace(mod_file.find(".tif"), 4, ".vrt").c_str(), poSrcDS, FALSE, NULL, NULL, NULL);
	poVRTDS->AddBand(GDT_Float64, NULL);
	poVRTDS->AddBand(GDT_Float64, NULL);

	char** papszOptions = NULL;
	papszOptions = CSLSetNameValue(papszOptions, "TILED", "YES");
	papszOptions = CSLSetNameValue(papszOptions, "COMPRESS", "LZW");

上述代码也很好理解。首先,我们创建两个
GDALDataset*
变量,分别指向
.tif
格式的
模板栅格图像文件
与我们将要创立的
.vrt
格式文件;随后,先用一次
CreateCopy()
函数,将模板文件的全部属性信息复制到
.vrt
格式文件中。接下来,就利用
AddBand()
函数,为
.vrt
格式文件增添两个波段。此时,加上原有的
1
个波段,
.vrt
格式文件就已经拥有了
3
个波段;而除此之外,
.vrt
格式文件的所有属性信息都是与
.tif
格式的
模板栅格图像文件
一致的。

接下来,就可以开始配置我们所需要创立的新的
.tif
格式栅格图像文件。其中,再用一次
CreateCopy()
函数,将
.vrt
格式文件的全部属性信息复制到新的
.tif
格式的栅格图像文件中。这样,我们新的
.tif
格式的栅格图像文件也就具有
3
个波段了。

	GDALDataset* poDstDS;
	poDstDS = poDriver->CreateCopy(out_file.c_str(), poVRTDS, FALSE, papszOptions, GDALTermProgress, NULL);

	GDALRasterBand* poOutBand;
	poOutBand = poDstDS->GetRasterBand(1);
	poOutBand->RasterIO(GF_Write, 0, 0, nXSize, nYSize, combination_out_pafScanline[pic_index_2 - 1], nXSize, nYSize, GDT_Float64, 0, 0);
	GDALRasterBand* poOutBand_2;
	poOutBand_2 = poDstDS->GetRasterBand(2);
	poOutBand_2->RasterIO(GF_Write, 0, 0, nXSize, nYSize, out_pafScanline[pic_index_2 - 1], nXSize, nYSize, GDT_Float64, 0, 0);
	GDALRasterBand* poOutBand_3;
	poOutBand_3 = poDstDS->GetRasterBand(3);
	poOutBand_3->RasterIO(GF_Write, 0, 0, nXSize, nYSize, qa_pixel_paf[pic_index_2 - 1], nXSize, nYSize, GDT_Float64, 0, 0);

上述代码就是基于
.vrt
格式文件,创建新的
.tif
格式的栅格图像文件,并对新的图像文件的
3
个波段依次赋值的全部过程。

通过上述方式,我们就实现了
CreateCopy()
函数创建新的栅格图像且
为新的栅格图像增添波段数量
的需求。

标签: none

添加新评论