创建大量栅格文件并分别写入像元数据: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代码实现的更多相关文章
- FileWriter文件文件字符输出流写入存储数据
1.FileWriter文件字符输出流-写入-存储数据 其中,流关闭之后再调用会报IOException; 其中,与文件字符输入流-写出-读取数据 和 字节输出流-写入-存储数据 不同的是,要先flu ...
- Node.js——fs模块(文件系统),创建、删除目录(文件),读取写入文件流
/* 1. fs.stat 检测是文件还是目录(目录 文件是否存在) 2. fs.mkdir 创建目录 (创建之前先判断是否存在) 3. fs.writeFile 写入文件(文件不存在就创建,但不能创 ...
- LINUX下目标文件的BSS段、数据段、代码段
http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 r ...
- 创建txt文件,并且写入内容
使用fopen的w方式就可以创建一个新的txt文件,如果文件名存在该文件内容会消失. 1. fopen的函数原型:FILE * fopen(const char * path,const char * ...
- Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据
背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlw ...
- Java向指定Excel写入读取数据
今天在开发中遇到用户列表导入导出的功能实现,这里了解到使用POI函数库可以完成此任务!特此记录一下 POI Apache POI是Apache软件基金会开放的源码函数库,POI提供API给Java程序 ...
- 关于java中创建文件,并且写入内容
以下内容完全为本人原创,如若转载,请注明出自:http://www.cnblogs.com/XiOrang/ 前两天在项目中因为要通过http请求获取一个比较大的json数据(300KB左右)并且保存 ...
- python (1)一个简单的爬虫: python 在windows下 创建文件夹并写入文件
1.一个简单的爬虫:爬取豆瓣的热门电影的信息 写在前面:如何创建本来存在的文件夹并写入 t_path = "d:/py/inn" #本来不存在inn,先定义路径,然后如果不存在,则 ...
- 写入数据到Plist文件中时,第一次要创建一个空的数组,否则写入文件失败
#pragma mark - 保存数据到本地Plist文件中 - (void)saveValidateCountWithDate:(NSString *)date count:(NSString *) ...
- api进阶Day2(低级流)文件流的输出流、读取流。向文件中写入文本数据、读取文件中的字符串、用lambda表达式创建文件过滤器。
文件流:输出流: package io; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...
随机推荐
- 构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践
作者|柳下 概述 随着企业规模和数据量的增长,数据的价值越来越受到重视.数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要.为了满足这一需求,数据库 CDC(Change Da ...
- centos7_Lnmp编译安装
17年面试运维岗位的时候,面试官要求输出一份lnmp编译的操作文档,于是有了如下安装nginx+php+mysql,进入正题: 准备环境 环境:centos7.3 软件:nginx-1.12.1 + ...
- 问题--VSCODE编写C含scanf无终端跳出
1.问题 在VSCODE中编写C程序,用到scanf输入时,发现无终端输入数据 2.解决方法 在设置里搜索RunInTerminal,勾选该选项即可
- [转帖]查询 HTTPS 网站 TLS 版本
参考 检查网站的TLS版本 – wentao's blog Linux curl 命令详解 - 腾讯云开发者社区-腾讯云 TLS 版本查询_天泽岁月的博客-CSDN博客_查看tls版本 使用 Open ...
- [转帖]datax安装+配置+使用文档
1 DataX离线同步工具DataX3.0介绍 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hiv ...
- 人大金仓学习之四-kmonitor
人大金仓学习之四-kmonitor 背景 kmonitor 其实时一个很好的工具和思路 开元的软件封装一下, 减轻技术复杂度,提高部署效率 并且能够更加快速的定位解决问题. 能够极大的提升客户体验. ...
- [转帖]CygWin、MingW、MSYS之间的关系
https://www.jianshu.com/p/09198f6e0a3c 前言 在跨平台开发或移植中,经常会听说Cygwin.MingW.MSYS,他们之间是什么关系?对于将要完成的任务,应该选择 ...
- Redis lua脚本简要学习
Redis lua脚本简要学习 背景 上周督促客户从Windows平台升级到了Linux平台. redis一周相安无事. 但是这周一突然又出现了卡断和慢的情况. 只能继续进行分析. 分析思路 现场日志 ...
- [转帖]Linux-文本处理三剑客awk详解+企业真实案例(变量、正则、条件判断、循环、数组、分析日志)
https://developer.aliyun.com/article/885607?spm=a2c6h.24874632.expert-profile.313.7c46cfe9h5DxWK 简介: ...
- [1036]Linux启动时间分析
简述 今天有同事咨询:项目上有台服务器操作系统启动时间较长,如何分析? 果然,好问题都来自实践. 经过查找,对于所有基于systemd的系统,可以使用systemd-analyze来分析系统启动时间. ...