首页 > 编程语言 >创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

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

时间:2024-02-04 13:55:59浏览次数:35  
标签:文件 代码 写入 C++ 栅格 NULL 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++,栅格,NULL,GDAL
From: https://www.cnblogs.com/fkxxgis/p/18006054

相关文章

  • A Knight's JourneyC++
    题目看半天看不懂。題目把我恶心坏了。看网上说按字典顺序输出,到底是什么意思半天没搞懂。#include<iostream>#include<string>usingnamespacestd;intd[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};intvisit[8][8]={0};boolDFS(i......
  • CLion 2023: 一款专注于性能和效率的C/C++ IDE mac/win版
    JetBrainsCLion2023是一款专为C和C++开发人员打造的强大集成开发环境。这个版本致力于提供卓越的性能、强大的功能和一流的智能代码编辑支持,帮助您更高效地开发高质量的C和C++应用程序。→→↓↓载CLion2023mac+win版首先,CLion2023提供了对最新C和C++标准的全面支持。无论......
  • c++20模块化编程与传统区别
    传统:main.cpp+a.cpp(存放定义)+a.h(存放声明)c++20:main.cpp+a.cppm(存放定义,在定义前面写export即可)模块化编程好处:不再需要修改了函数到对应修改声明,两头跑编译更快,模块只在修改后才重新编译模块化编程举例://my_module.cppmimport<iostream>;exportm......
  • Find The MultipleC++
    这题就是找N的倍数m,M要求是由1和0组成且非0。可以用图来看,从1出发临边是1和0,然后广度遍历,第一个能能整除N的数输出就行。#include<iostream>#include<queue>usingnamespacestd;intmain(){intn=-1;while(cin>>n){if(n==0)break;longlon......
  • c++加速cin和关闭同步流
    signedmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);intT=1;//cin>>T;while(T--)solve();return0;}一·ios::sync_with_stdio(false);01"c++是否兼容stdio(c)"的开关函数02默认参数为true:将输出流绑到一起保证......
  • 【C++】力扣101-平方数之和
    给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2+b2=c 。使用双指针:#include<iostream>#include<math.h>usingnamespacestd;booljudge(longc){if(c<0)returnfalse;longa=0;longb=(int)sqrt(c);longsum=0;while......
  • 12. C++ 类其实也是一种作用域
    C++类其实也是一种作用域类其实也是一种作用域,每个类都会定义它自己的作用域。在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员既可以通过对象访问,又可以通过类访问,在类内用typedef定义的类型只能通过类来访问。下面的例子使......
  • 【C++】类和对象(一)[类的相关定义及this指针]
    C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C++在C语言的基础上增加了面向对象编程,C++支持面向对象程序设计。类是C++的核心特性,通常被称为用户定义的类......
  • Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用
    一、前言之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutput的采样率,可以规避这个问题,破音不在出现了,但是音调变了,倍速越大变得越快,人声越发不清晰,变得尖......
  • 在 Windows 10 上使用 Visual Studio 2022 C++ 桌面开发
    工具下载链接:https://pan.quark.cn/s/c70b23901ccb环境介绍在今天的快速发展的软件开发行业中,选择合适的开发环境是非常关键的一步。对于C++开发人员来说,VisualStudio2022(VS2022)是一个强大的集成开发环境(IDE),特别是在Windows10操作系统中。安装VisualStudio2022本文将引导您......