怀念夏天 发表于 2024-4-22 16:38:03

C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组

  本文介绍基于C++语言GDAL库,批量读取大量栅格遥感影像文件,并生成各像元数值的时间序列数组的方法。
  首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多不同格式的文件,如下图所示。
https://img2024.cnblogs.com/blog/3080295/202402/3080295-20240203125516012-1521934911.png
  其中,我们首先需要遍历这一文件夹,遴选出其中所有类型为.bmp格式的栅格遥感影像文件(一共有6个),并分别读取文件(已知这些遥感影像的行数、列数都是一致的);随后,将不同遥感影像的同一个位置的像素的数值进行分别读取,并存储在一个数组中。例如,最终我们生成的第一个数组,其中共有6个元素,分别就是上图所示文件夹中6景遥感影像各自(0,0)位置的像元数值;生成的第二个数组,其中也是6个元素,分别就是6景遥感影像各自(1,0)位置的像元数值,以此类推。其中,显然我们得到的数组个数,就是遥感影像像元的个数。此外,这里6景遥感影像的排序,是按照文件名称的升序来进行的。
  明确了具体需求,接下来就可以开始代码的实践。其中,本文分为两部分,第一部分为代码的分段讲解,第二部分为完整代码。
  此外,本文是基于GDAL库来实现栅格数据读取的;具体GDAL库的配置方法大家可以参考文章在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)。
1 代码分段介绍

1.1 代码准备

  这一部分主要是代码的头文件、命名空间与我们自行撰写的自定义函数get_need_file()的声明;具体代码如下所示。
#include <iostream>
#include <vector>
#include <io.h>
#include "gdal_priv.h"

using namespace std;

void get_need_file(string path, vector<string>& file, string ext);  其中,由于我们在接下来的代码中需要用到容器vector这一数据类型,因此首先需要添加#include ;同时,我们在接下来的代码中需要用到头文件io.h中的部分函数(主要都是一些与计算机系统、文件管理相关的函数),因此需要添加#include ;此外,我们是基于GDAL库来实现栅格数据读取的,因此需要添加#include "gdal_priv.h"。
  接下来,这里声明了一个自定义函数get_need_file(),具体我们在本文1.2部分介绍。
1.2 栅格文件筛选

  由于我这里几乎将全部的代码都放在了主函数中,因此这一部分就先介绍代码main()函数的第一部分,亦即栅格文件的遴选部分;具体代码如下所示。
int main() {        string file_path = R"(E:\02_Project\02_ChlorophyllProduce\01_Data\00_Test)";        vector my_file;        string need_extension = ".bmp";        get_need_file(file_path, my_file, need_extension);        int file_size = my_file.size();        if (file_size == 0)        {                cout
页: [1]
查看完整版本: C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组