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

这篇具有很好参考价值的文章主要介绍了创建大量栅格文件并分别写入像元数据: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代码实现

  基于此,即可完成批量创建、写入栅格数据的操作。文章来源地址https://www.toymoban.com/news/detail-825013.html

到了这里,关于创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python-文件的创建与写入

    功能: 生成文件对象,进行创建,读写操作 用法: open(path,mode) 参数说明∶ path:文件路径 mode :操作模式 返回值: 文件对象 举例: f = open(\\\'d://a.txt\\\' , ‘w\\\') 写入模式(“w”):打开文件进行写入操作。如果文件已存在,则会覆盖原有内容;如果文件不存在,则会创建新文件。 注意

    2024年02月11日
    浏览(26)
  • 创建 CephFS 文件系统 MDS 接口(短暂的分别是为了更好的再见)

    ceph 是一种统一的分布式文件系统,具有优秀的性能、高可用性和可扩展性。ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。在国内一些公司的云环境中,通常会采用 ceph 作为 openstack 的唯一后端存储来提高数据转发效率。 官网:https

    2024年02月17日
    浏览(34)
  • C#创建文件写入及追加内容

    1.判断文件是否存在,若存在则打开写入,否则创建文件并写入 2.调用方法写入内容,其中回车用rn  3.txt文件中追加内容  4.调用追加TXT方法,并将dataGridView控件内容写入txt       

    2024年02月15日
    浏览(28)
  • 利用MATLAB读取.nc文件单像元数值并转为Excel格式(以中国日降雨量月均数据为例)

     以中国日降雨量月均数据(nc文件包含12月)为例,提取某经纬度下的多月份像元值。 (【数据分享】1960-2020年中国1公里分辨率月降水数据集) 一、确定经纬度所在行列 号 以 92.18E,30.475N 为例,首先在Matlab中输入以下代码: 工作区获取到lat、lon和pre的信息,打开lat和lon文件

    2024年02月07日
    浏览(32)
  • Linux下文件的创建写入读取编程

            在linux下操作一个文件,首先要保证文件的存在(不存在就创建),接着打开文件( 打开成功 )并得到 文件描述符 ,接着在进行读写操作,最后还需要关闭文件。如果我们对文件进行读写之后不关闭文件,而直接关闭我们的编译器,可能会造成文件损坏。      

    2024年01月18日
    浏览(30)
  • 用shell实现 创建文件并写入字符

    为了在 shell 中创建文件并写入字符,可以使用 echo 命令和重定向符号 。 例如,下面的命令会创建一个名为 \\\"myfile.txt\\\" 的文件,并在文件中写入字符 \\\"hello\\\": 如果要在文件中追加字符而不是覆盖原有内容,可以使用重定向符号 。 例如,下面的命令会在 \\\"myfile.txt\\\" 文件末尾追加

    2024年02月16日
    浏览(27)
  • Python 文件处理指南:打开、读取、写入、追加、创建和删除文件

    文件处理是任何Web应用程序的重要部分。Python有多个用于创建、读取、更新和删除文件的函数。 在Python中处理文件的关键函数是open()函数。open()函数接受两个参数:文件名和模式。 有四种不同的方法(模式)可以打开文件: \\\"r\\\" - 读取 - 默认值。打开一个文件以进行读取,如

    2024年02月05日
    浏览(52)
  • Java创建txt文件并存入内容】—— 使用Java编写代码创建和写入文本文件

    Java创建txt文件并存入内容】—— 使用Java编写代码创建和写入文本文件 文件操作是在软件开发中常见的任务之一。在Java中,你可以使用标准的I/O类来创建和写入文本文件。下面是使用Java编写的示例代码,演示了如何创建一个txt文件并将内容写入其中。 以上代码演示了如何创

    2024年02月05日
    浏览(43)
  • Java 文件处理完全指南:创建、读取、写入和删除文件详细解析

    文件处理是任何应用程序的重要部分。Java 提供了许多用于创建、读取、更新和删除文件的方法。 Java 文件处理 Java 中的文件处理主要通过 java.io 包中的 File 类完成。该类允许我们处理文件,包括创建、读取、写入和删除文件。 要使用 File 类,我们首先需要创建该类的对象,

    2024年03月18日
    浏览(53)
  • C 语言文件处理全攻略:创建、写入、追加操作解析

    在 C 语言中,您可以通过声明类型为 FILE 的指针,并使用 fopen() 函数来创建、打开、读取和写入文件: FILE 基本上是一个数据类型,我们需要创建一个指针变量来使用它 ( fptr )。现在,这行代码并不重要。它只是在处理文件时需要的东西。 要实际打开文件,请使用 fopen() 函数

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包