码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 找出长时序遥感影像的缺失日期并用像素均为0的栅格填充缺失日期的文件


    本文介绍基于C++语言的GDAL库,基于一个存储大量遥感影像的文件夹,依据每一景遥感影像的文件名中表示日期的那个字段,找出这些遥感影像中缺失的成像日期,并新生成多个像元值全部为0的栅格文件,作为这些缺失日期当日的遥感影像文件的方法~
    合集 - 学术工作效率(49)
    1.安装Amos结构方程模型分析软件的方法2023-04-282.如何不显示我的电脑、回收站等图标?2023-05-053.SPSS计算极值、平均值、中位数、方差、偏度、峰度、变异系数2023-05-084.无需代码绘制人工神经网络ANN模型结构图的方法2023-05-105.论文的技术路线流程图如何绘制?2023-05-196.电脑缩放异常、显示亮度无法调整的处理办法2023-06-067.EndNote参考文献格式Output Styles界面介绍2023-06-088.Windows电脑环境变量(用户变量、系统变量)的修改2023-07-139.如何修改电脑的BIOS密码?2023-07-2210.叶绿素含量测定仪SPAD-502怎么使用?2023-07-2911.全球都有哪些高光谱遥感卫星?2023-08-1912.创建Anaconda虚拟Python环境的方法2023-09-0913.Anaconda虚拟环境配置Python库与Spyder编译器2023-10-1414.小提琴图的绘制方法:Python matplotlib实现2023-10-1615.如何用CAN-EYE获取植被参数数据?2023-10-2216.ArcMap属性表出现乱码情况的解决2023-10-2717.考研保研、夏令营推免的简历模板2023-12-1518.安装MicroStation软件、Terrasolid插件的方法01-2219.VMware虚拟机部署Linux Ubuntu系统的方法01-2420.在Linux Ubuntu系统中部署C++环境与Visual Studio Code软件01-2621.安装Visual Studio的详细流程01-2822.获取Visual Studio所用MSVC编译器版本:_MSC_VER数值01-2923.Visual Studio部署C++矩阵库Armadillo的方法01-3024.如何在Visual Studio新C++项目中调用之前配置过的库?01-3125.在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)02-0126.C++遴选出特定类型的文件或文件名符合要求的文件02-0227.初步上手Git软件及GitHub平台:基本操作方法02-0528.下载、安装Git并拷贝GitHub项目到本地的流程02-0629.Visual Studio部署matplotlib绘图库的C++版本02-0730.Anaconda与Python环境在Windows中的部署03-0131.Windows配置R语言、RStudio开发环境03-0332.Visual Studio部署C++环境下OpenCV库03-0633.ArcMap的mxd文件没有数据、显示感叹号怎么办?03-2234.绘制三元图、颜色空间图:R语言代码03-2735.Linux电脑如何下载QGIS?03-2936.Python表格处理模块xlrd在Anaconda中的安装04-0137.Postman模拟浏览器网页请求并获取网页数据04-0338.多次复制Excel符合要求的数据行:Python批量实现04-0839.电脑开机时报错No Bootable Device找不到索引的解决方法04-1240.论文研究区域图的制作方法:ArcGIS04-1741.修改中文、英文参考文献在文末列表中的顺序:EndNote04-1942.ArcPy自动绘制大量地图并设置地图要素:Python04-2243.Python提取文本文件(.txt)数据的方法05-2444.将大量文件的拓展名中大写字母改为小写:Python实现05-2545.浏览器打开JupyterLab后所有快捷键与窗口按键均失效怎么办?05-2746.将编译过的C++库迅速部署在Visual Studio新项目中05-2847.EndNote里参考文献的期刊名显示错误怎么办?05-29
    48.找出长时序遥感影像的缺失日期并用像素均为0的栅格填充缺失日期的文件05-31
    49.Python依据遥感影像的分幅筛选出对应的栅格文件06-01
    收起

      本文介绍基于C++语言的GDAL库,基于一个存储大量遥感影像的文件夹,依据每一景遥感影像的文件名中表示日期的那个字段,找出这些遥感影像中缺失的成像日期,并新生成多个像元值全部为0的栅格文件,作为这些缺失日期当日的遥感影像文件的方法。

      首先,我们来看一下本文需要实现的需求。现在有一个文件夹,存储了从2018年第001天到2022年第361天的全部遥感影像,其中每一景图像的像元个数、空间参考信息、NoData值等都是一致的。对于这些遥感影像,原本应该是每10天就有1景;但是由于遥感影像数据有缺失,因此部分日期没有对应的遥感影像。如下图所示,可以看到比如2018年的061这一天,它就没有对应的遥感影像。

    image

      但是,由于后期处理的需要,我们现在希望对这些缺失日期的遥感影像文件加以填补——具体的需求是,我们新建若干个像元值全部为0的栅格文件,作为每一个缺失日期当日的遥感影像文件;这些填补的、新的遥感影像文件的各项信息(比如像元个数、空间参考信息等)都和原本的文件一致即可,只要保证全部的像元都是0就行。

      知道了需求,我们就可以开始代码的撰写。本文用到的代码具体如下所示。其中,关于C++语言配置GDAL库的方法,大家可以参考文章在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)。

    #include 
    #include 
    #include 
    #include "gdal_priv.h"
    #include "cpl_conv.h"
    
    using namespace std;
    
    void create_missing_raster(string path);
    
    int main() {
        string file_path = R"(E:\02_Project\TIFF\TEST)";
        create_missing_raster(file_path);
        return 0;
    }
    
    void create_missing_raster(string path)
    {
    	vector<string> all_file_path;
    	for (int year = 2018; year <= 2022; year++)
    	{
    		for (int day = 1; day <= 361; day += 10)
    		{
    			ostringstream oss;
    			oss << path << "/Albers_MuSyQ.NDVI.16m." << to_string(year) << setfill('0') << setw(3) << to_string(day) << "000000.49SDB.001.h5NDVI-NDVI.tif";
    			all_file_path.push_back(oss.str());
    		}
    	}
    
    	GDALAllRegister();
    	int x_size, y_size;
    	string one_actual_path;
    	for (string& one_file_path : all_file_path)
    	{
    		GDALDataset* poDataset_actual;
    		poDataset_actual = (GDALDataset*)GDALOpen(one_file_path.c_str(), GA_ReadOnly);
    		if (poDataset_actual != NULL)
    		{
    			one_actual_path = one_file_path;
    			x_size = poDataset_actual->GetRasterXSize();
    			y_size = poDataset_actual->GetRasterYSize();
    			GDALClose((GDALDatasetH)poDataset_actual);
    			break;
    		}
    	}
    
    	for (string& one_file_path : all_file_path)
    	{
    		if (CPLCheckForFile((char*)one_file_path.c_str(), NULL) == FALSE)
    		{
    			GDALDataset* poDataset;
    			GDALDriver* poDriver;
    			poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");
    			GDALDataset* poDataset_actual;
    			poDataset_actual = (GDALDataset*)GDALOpen(one_actual_path.c_str(), GA_ReadOnly);
    			poDataset = poDriver->CreateCopy(one_file_path.c_str(), poDataset_actual, FALSE, NULL, NULL, NULL);
    			double* pafScanline = new double[x_size * y_size];
    			for (int i = 0; i < x_size * y_size; i++)
    			{
    				pafScanline[i] = 0.0;
    			}
    			GDALRasterBand* poBand;
    			poBand = poDataset->GetRasterBand(1);
    			poBand->RasterIO(GF_Write, 0, 0, x_size, y_size, pafScanline, x_size, y_size, GDT_Float64, 0, 0);
    			delete[] pafScanline;
    			GDALClose((GDALDatasetH)poDataset);
    			GDALClose((GDALDatasetH)poDataset_actual);
    			cout << "New file is :" << one_file_path << endl;
    		}
    	}
    	GDALDestroyDriverManager();
    }
    

      上述代码主要都是在create_missing_raster(string path)函数内实现具体功能的,我们主要就对这一函数加以讲解。

      首先,我们需要基于文件夹中遥感影像文件的文件名称特征,遍历生成文件名列表。在这里,我们使用两个嵌套的for循环,生成所有可能的栅格图像文件名,并将这些文件名保存在all_file_path向量中。其中,栅格图像的文件名根据年份和天数生成,并通过setfill('0')与setw(3)这两个函数保证我们生成的日期满足YYYYDDD这种格式。

      随后,基于GDALAllRegister这一GDAL库的初始化函数,用于注册所有支持的数据格式驱动程序。接下来,我们使用GDALOpen函数,从2018001这一天开始,通过循环打开对应名字的文件,直到找到文件夹中第一个实际存在的栅格图像文件(poDataset_actual),并获取其栅格图像的行列数(x_size和y_size);我们后期的操作需要用到这个行列数,并且会将这个实际存在的栅格文件作为生成新的栅格文件的模板。

      接下来,我们遍历文件名列表all_file_path,对每个文件名进行处理。对于不存在的栅格图像文件,使用GDALDriver创建一个新的数据集(poDataset),并将其中的像元值设置为0。如果栅格图像文件已经存在,则跳过不处理。其中,在对缺失的栅格图像加以生成时,我们首先使用GetGDALDriverManager()->GetDriverByName函数获取GDAL驱动程序对象,然后使用CreateCopy函数创建新的栅格图像;其中,我们就是以前期找到的文件夹中第一个实际存在的栅格图像文件one_actual_path为模板。随后,我们用0填充新创建的栅格图像,并使用RasterIO函数对栅格图像的像元进行写入操作。

      最后,在上述处理完成后,使用GDALClose函数关闭数据集,并输出新创建的栅格图像的文件名。随后,我们使用GDALDestroyDriverManager销毁GDAL驱动程序管理器,释放资源。

      随后,我们运行代码,可以看到每一个新生成的栅格图像文件(也就是原本当日没有成像的日期对应的遥感影像)都会打印出来。

      随后,我们打开文件夹,可以看到之前没有遥感影像的日期,目前也都存在一景遥感影像与其对应了。比如2018年的061这一天,目前已经有了一景遥感影像。

      至此,大功告成。

  • 相关阅读:
    ADSP-21569/ADSP-21593的开发入门(中)
    java计算机毕业设计网上宠物售卖平台源码+系统+mysql数据库+LW文档+部署文件
    Linux系统之ip命令的基本使用
    COMSOL超声换能器聚焦声场仿真
    一个完整的数据分析案例 | 用Python搞定用户预测分析
    Javascript 使用技巧
    关于 在Qt中的timerEvent信号中设置QCustomplot的日期时间轴范围乱蹿(编译器优化变量volatile) 的解决方法
    超越 Transformer开启高效开放语言模型的新篇章
    qt 5.15.2 安卓 macos
    Linux c++ 中文字符转十六进制 UTF-8 编码
  • 原文地址:https://www.cnblogs.com/fkxxgis/p/18225102
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号