首页 > 编程语言 >C++:GDAL中CreateCopy()函数生成的栅格图像如何修改波段数?

C++:GDAL中CreateCopy()函数生成的栅格图像如何修改波段数?

时间:2024-01-16 22:01:09浏览次数:50  
标签:vrt CreateCopy C++ 格式文件 栅格 图像文件 tif

  本文介绍基于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()函数创建新的栅格图像且为新的栅格图像增添波段数量的需求。

标签:vrt,CreateCopy,C++,格式文件,栅格,图像文件,tif
From: https://blog.51cto.com/fkxxgis/9278463

相关文章

  • 校正多期土地利用数据栅格范围不一致导致栅格偏差问题
    1所用软件:ArcGISPro3.0.22示例数据:中科院CNLUCC土地利用数据3问题描述:中科院的多年CNLUCC土地利用,有几期的土地利用数据范围不一致,有栅格偏移的问题1990年的范围为:                     2020年的范围为: 两幅影像的边缘......
  • C++学习日记 2024-1-16
    开始学习C++几天了,之前没有记录,从现在开始,记录一下学习过程复习与回忆:1.引用与指针共同优点:只用引用与指针,在传递参数时,可以减少拷贝,减少内存消耗,提高效率指针优点:指针比引用更强大,所有引用能做的事,指针都能做,指针缺点:危险,指针可以为空,指针指向地址,同一地址可以......
  • C++(静态成员函数、静态成员变量)
    目录静态成员函数(StaticMemberFunctions)静态成员变量(StaticMemberVariables)在C++中,静态成员函数和静态成员变量是与类相关联而不是与类的实例相关联的。它们属于类而不是类的实例,并且可以通过类名访问,而不需要创建类的实例。静态成员函数(StaticMemberFunctions)静态成员......
  • c++程序加速方法
    1.将反复使用的数据存放在全局变量里面。需要重复使用的数据,比如加载的图片,CSV文件等数据,存放在全局变量里面,每次加载DLL时,只加载一次,直到卸载DLL,这些数据一直保持在内存中,避免重复加载,经过测试,这样处理之后,漏装检测的时间由2.5S降低到了1.5S,因为反复读取文件,图片是一个很消耗时......
  • C++ 重载bool类型
    在C++中,可以通过重载operatorbool()来实现对自定义类型的bool类型重载。这样,您可以定义自定义类型的对象在条件语句中的行为,使其能够像内置类型一样进行条件判断。下面是一个示例,演示了如何在C++中重载bool类型:#include<iostream>#include<string>usingnamespacestd;cl......
  • C++U3-第10课-排序进阶(归并、快排)
    归并排序是一种经典的排序算法,适用于各种不同场景和数据类型的排序需求。它具有以下使用背景和优势:通用性:归并排序适用于各种不同类型的数据结构和数据类型,包括数组、链表、字符串等。它可以对任意长度的序列进行排序。稳定性:归并排序是一种稳定的排序算法,即在排序过程中相......
  • C++---打开txt文件进行字符串的查找替换最终生成Excel文件
    #include<iostream>#include<fstream>#include<sstream>#include<string>#include<vector>#include<algorithm>#include<iomanip>usingnamespacestd;voidfindAndReplaceAll(string&source,conststring&......
  • c++重载
    注意:函数的返回值不可以作为函数重载的条件函数重载的注意事项1.引用作为重载的条件2.函数重载遇到函数默认参数......
  • 《c++lib篇》lib简介
    lib简介原文链接:https://blog.csdn.net/ucliaohh/article/details/128324744静态链接库,静态链接1、静态链接库,有lib、h二个文件。lib包含函数代码本身,在编译时直接将代码加入程序当中。(这种方式不是很灵活,因为lib被编译到.exe中,写出的程序体积大,但是只需要发布exe即可,不需要dl......
  • 《c++dll篇》VS2019生成dll及调用
    VS2019生成dll及调用生成DLL1.创建dll工程2.编写dll函数经过上述过程后工程中会生成几个自带的文件,可以自行创建或者更名,我直接在上面进行编写了。如下我先在pch.h中创建我需要调用函数的声明,他们分别用于实现加法和取最大值的功能,你可以根据自己的需求更改成自己的子程序。......