当前位置: 首页 > news >正文

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

相关文章:

  • 基于maven的spring项目实现登录注册(SSM)
  • 【C++】动态内存管理
  • 波士顿动力再惊艳!机器人大秀男团舞,举手投足人味满满,多次转卖后展示新标签...
  • Python 代码托管到码云平台,原来这么简单
  • 【MATLAB教程案例26】图像特征点提取算法matlab仿真与分析——sift,surf,kaze,corner,BRISK等
  • 前端深拷贝与浅拷贝(附实现方法)
  • C#工业生产线MES系统,源代码分享
  • 2022软考高项十大领域知识整理(四)-人力资源管理、干系人管理、采购管理
  • 企业级低代码平台Jeecgboot3.4.2及3.4.3版本新功能介绍
  • SQL SERVER Sequence Number 序列号
  • 【Web实战-Tomcat-Servlet-Thymeleaf -JDBC-MySQL】浏览器页面显示数据库数据(水果库存系统)
  • 【超好懂的比赛题解】2022CCPC四川省赛 个人题解
  • Pytest如何执行txt格式的文本测试
  • 目标检测算法——YOLOv5 结合Swin Transformer V2
  • Web3究竟红在哪里,它的出现能为人类社会带来什么?
  • [nginx文档翻译系列] 控制nginx
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • C++类的相互关联
  • Date型的使用
  • JAVA 学习IO流
  • Java方法详解
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Vim 折腾记
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 给初学者:JavaScript 中数组操作注意点
  • 排序算法之--选择排序
  • 人脸识别最新开发经验demo
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用common-codec进行md5加密
  • 微服务入门【系列视频课程】
  • 微信小程序设置上一页数据
  • 小程序开发之路(一)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • - 转 Ext2.0 form使用实例
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​secrets --- 生成管理密码的安全随机数​
  • ​决定德拉瓦州地区版图的关键历史事件
  • (14)Hive调优——合并小文件
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)Dubbo快速入门、介绍、使用
  • (转)关于多人操作数据的处理策略
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net Signalr 使用笔记
  • .net 怎么循环得到数组里的值_关于js数组
  • .net6使用Sejil可视化日志
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET是什么
  • .NET序列化 serializable,反序列化
  • .Net中的集合