创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

2024-04-10 22:36

本文主要是介绍创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  首先,我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组;而随后,就需要对我们处理后的栅格数据再进行输出,即建立新的大量的栅格遥感影像,并将我们处理后的像元数据依次输入进去。

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

#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++遴选出特定类型的文件或文件名符合要求的文件。

  接下来,就是基于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等语句释放内存、取消指针。

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

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

这篇关于创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892336

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”