C++中GDAL为CreateCopy()创建的栅格图像增添波段数量的方法

简介: C++中GDAL为CreateCopy()创建的栅格图像增添波段数量的方法

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

欢迎关注:疯狂学习GIS

相关文章
|
7月前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
109 9
|
6月前
|
算法 Linux C++
C++框架设计中实现可扩展性的方法
在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
513 2
|
3月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
46 6
|
3月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
104 0
|
4月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
65 1
|
4月前
|
C++
C++ 避免多重定义的方法
C++ 避免多重定义的方法
65 0
|
4月前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
6月前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
6月前
|
存储 编译器 程序员
C++语言速成方法
C++语言速成方法
|
6月前
|
C++ UED 开发者
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
94 0