C++中GDAL批量创建多个栅格图像文件并批量写入数据

简介: C++中GDAL批量创建多个栅格图像文件并批量写入数据

  本文介绍基于C++ 语言GDAL库,批量创建大量栅格遥感影像文件,并将数据批量写入其中的方法。

  首先,我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C++中GDAL批量读取大量栅格遥感影像文件并生成各像元在不同文件中数值的时间序列数组https://blog.csdn.net/zhebushibiaoshifu/article/details/127349226);而随后,就需要对我们处理后的栅格数据再进行输出,即建立新的大量的栅格遥感影像,并将我们处理后的像元数据依次输入进去。

  明确了具体需求,接下来就可以开始代码的实践;本文所用到的具体代码如下。这里需要注意,在这里就仅将与本文需求有关的代码放了上来,其他无关的代码就省略了(所以以下代码只是程序主函数中的一部分);大家在实践过程中,依据自己的需求,将自己代码与本文的代码相结合就可以。

#include <iostream>
#include "gdal_priv.h"
//以下只列出栅格数据批量创建、写入与导出的代码,其他无关的代码就省略了~
  int pic_index_2 = 1;
  for (auto x : my_file)
  {
    const char* pszFormat = "GTiff";
    GDALDriver* poDriver;
    GDALAllRegister();
    poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
    if (poDriver == NULL)
      cout << "There is an error with poDriver!" << endl;
    GDALDataset* poSrcDS = (GDALDataset*)GDALOpen(mod_file.c_str(), GA_ReadOnly);
    GDALDataset* poDstDS;
    char** papszOptions = NULL;
    papszOptions = CSLSetNameValue(papszOptions, "TILED", "YES"); //建立金字塔
    papszOptions = CSLSetNameValue(papszOptions, "COMPRESS", "LZW");
    int pos_need = x.rfind("CSI");
    string file_name = x.substr(pos_need);
    string out_file = out_path + "//R_" + file_name;
    poDstDS = poDriver->CreateCopy(out_file.c_str(), poSrcDS, FALSE, papszOptions, GDALTermProgress, NULL);
    GDALRasterBand* poOutBand;
    poOutBand = poDstDS->GetRasterBand(1);
    poOutBand->RasterIO(GF_Write, 0, 0, nXSize, nYSize, out_pafScanline[pic_index_2 - 1], nXSize, nYSize, GDT_Float64, 0, 0);
    pic_index_2++;
    GDALClose((GDALDatasetH)poDstDS);
    GDALClose((GDALDatasetH)poSrcDS);
  }
  delete[] pafScanline;
  delete[] out_pafScanline;
  delete[] pixel_paf;
  delete[] pixel_paf_result;
  pafScanline = NULL;
  out_pafScanline = NULL;
  pixel_paf = NULL;
  pixel_paf_result = NULL;

  以上代码的思路其实也非常简单。首先,因为是需要对大量的栅格进行批量操作,所以代码整体是在for循环中进行的,每一个循环都是对一个独立的栅格文件的创建、数据写入与文件保存操作;其中,"GTiff"表示我们将要生成的栅格文件是.tif格式的,如果大家需要生成别的格式的话可以修改这里;auto x : my_file表示从我们前期已经获取到的需要处理的栅格文件列表中遍历(虽然我们这里是需要建立新的栅格文件,但由于我这里新的栅格文件的命名规则是与原有的栅格文件一致的,所以就还是从原有的文件列表中遍历),my_file就是前期已经获取到的需要处理的栅格文件列表,具体获取方法可以参考文章C++遍历文件夹获取各文件名称并筛选指定格式类型的文件或具有特定名称的文件https://blog.csdn.net/zhebushibiaoshifu/article/details/127235120)。

  接下来,就是基于GDAL库来实现栅格数据的创建于写入。在GDAL库中,如果我们想用自己的数据生成栅格文件,首先需要基于CreateCopy()函数新建一个栅格文件,随后通过RasterIO()函数写入数据。其中,poSrcDS是一个指向模板栅格文件的指针;在我们用CreateCopy()函数新建栅格文件时,新的栅格文件的各项属性,比如行数、列数、像元大小、坐标信息等,都直接与这个模板栅格文件保持一致。随后,poDstDS则是指向我们此时将要新建的栅格文件的指针。

  接下来,我们通过CSLSetNameValue()函数,配置一下将要生成的新的栅格文件的属性,比如"TILED", "YES"表示栅格文件同时生成金字塔,"COMPRESS", "LZW"表示栅格文件通过LZW算法进行压缩等。

  再接下来,是配置我们新的栅格文件的文件名的代码部分。因为我们是需要批量生成大量的栅格文件的,所以其文件名肯定不能手动逐一修改;我这里就是直接在已有文件的文件名基础上,增添了一个字母,作为新栅格文件的文件名;这里就是通过字符串的截取等操作来实现新的文件名的生成。其中,out_path是我们已经定义过的变量,表示结果保存路径。

  完成以上全部配置后,即可依据CreateCopy()函数进行新的栅格文件的创建。

  至此,我们仅仅是完成了GDAL库中栅格文件的创建,但此时还没有将数据导入进去,因此在资源管理器中也是看不到具体的新的栅格文件的。随后,我们基于RasterIO()函数,将数据写入栅格文件即可;其中,out_pafScanline[pic_index_2 - 1]就是需要写入到每一景遥感影像中的数据。

  完成以上工作后,我们就完成了对其中一景遥感影像的创建、写入,此时资源管理器中就会看到这一景图像的文件已经存在。随后,通过GDALClose()函数将刚刚指向的栅格遥感文件关闭,并进行下一次循环。对全部需要生成的栅格遥感影像文件都完成遍历后,则通过delete[]= NULL等语句释放内存、取消指针。

  此时,即可在目标文件夹中看到我们批量生成的栅格文件。

  基于此,即可完成批量创建、写入栅格数据的操作。

欢迎关注:疯狂学习GIS

相关文章
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
19 0
Linux c/c++文件的基本操作
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
46 0
|
1月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
66 0
|
2月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
32 0
|
3月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
50 2
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
20 0
|
3月前
|
监控 编译器 C++
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
82 0
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4