C++ GDAL创建栅格文件并将指定数据写入

开启成长之旅!这是我参加「日新方案 2 月更文挑战」的第12天,点击检查活动概况。

  本文介绍根据C++ 语言GDAL库,批量创建很多栅格遥感印象文件,并将数据批量写入其间的办法。

  首要,咱们来清晰一下本文所需完成的需求。已知咱们对很多遥感印象进行了批量读取与数据处理操作——详细过程能够参阅文章C++读取多张栅格图像并获得像元的时间序列变化数组;而随后,就需求对咱们处理后的栅格数据再进行输出,即建立新的很多的栅格遥感印象,并将咱们处理后的像元数据顺次输入进去。

  清晰了详细需求,接下来就能够开端代码的实践;本文所用到的详细代码如下。这儿需求留意,在这儿就仅将与本文需求有关的代码放了上来,其他无关的代码就省掉了(所以以下代码只是程序主函数中的一部分);大家在实践过程中,根据自己的需求,将自己代码与本文的代码相结合就能够。

#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创建栅格文件并将指定数据写入

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