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

C++ GDAL找出多时相遥感影像缺失的日期并自动生成新的全零图像作为替补

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

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

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

  知道了需求,我们就可以开始代码的撰写。本文用到的代码具体如下所示。其中,关于C++ 语言配置GDAL库的方法,大家可以参考文章Visual Studio配置并编译C++环境下GDAL库、SQLite环境与PROJ库的方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/127088090)。

#include <iostream>
#include <iomanip>
#include <sstream>
#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_sizey_size);我们后期的操作需要用到这个行列数,并且会将这个实际存在的栅格文件作为生成新的栅格文件的模板。

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

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

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

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

  至此,大功告成。

欢迎关注:疯狂学习GIS

相关文章:

C++ GDAL找出多时相遥感影像缺失的日期并自动生成新的全零图像作为替补

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

【AI底层逻辑】——篇章5(下):机器学习算法之聚类降维时间序列

续上&#xff1a; 目录 4、聚类 5、降维 6、时间序列 三、无完美算法 往期精彩&#xff1a; 4、聚类 聚类即把相似的东西归在一起&#xff0c;与分类不同的是&#xff0c;聚类要处理的是没有标签的数据集&#xff0c;它根据样本数据的分布特性自动进行归类。 人在认知是…...

P1980 [NOIP2013 普及组] 计数问题

[NOIP2013 普及组] 计数问题 题目描述 试计算在区间 1 1 1 到 n n n 的所有整数中&#xff0c;数字 x x x&#xff08; 0 ≤ x ≤ 9 0\le x\le9 0≤x≤9&#xff09;共出现了多少次&#xff1f;例如&#xff0c;在 1 1 1 到 11 11 11 中&#xff0c;即在 1 , 2 , 3 , 4…...

需求管理全过程流程图及各阶段核心关注点详解

分析报告指出&#xff0c;多达76%的项目失败是因为差劲的需求管理&#xff0c;这个是项目失败的最主要原因&#xff0c;比落后的技术、进度失控或者混乱的变更管理还要关键。很多项目往往在开始的时候已经决定了失败&#xff0c;谜底就在谜面上&#xff0c;开始就注定的失败&am…...

Android开源 自定义emoji键盘,EmojiPack v2.1版本

目录 一&#xff0c;简介 二、安装 添加jitpack 仓库 添加依赖: 混淆规则: 三、使用 1、一次性配置emoji显示处理 二、emoji的自定义键盘的使用 一&#xff0c;简介 EmojiPack当前已提供emoji的显示和emoji的选择自定义键盘&#xff0c;在emoji显示这一方面&#xff0…...

SOLIDWORKS软件的优势分析 硕迪科技

在现代的机械设计领域&#xff0c;SOLIDWORKS是一款备受青睐三维设计软件&#xff0c;它具备强大的建模和设计功能&#xff0c;在全球范围内广泛应用于机械设计和工程领域&#xff0c;为用户提供了全面的工程解决方案。本文就SOLIDWORKS的优势进行详细分析。 1、易于学习和使用…...

Android性能优化之游戏的Theme背景图

近期&#xff0c;对游戏的内存优化&#xff0c;通过内存快照发现&#xff0c;某个Activity的theme背景图 占用3M 多。考虑着手对齐进行优化。 问题 查看游戏中的内存快照&#xff0c;发现有一个图片bitmap 占用3M 多&#xff0c;设置在Activity的背景中&#xff1a; 查看Phon…...

网络安全(黑客)系统自学,成为一名白帽黑客

前言 黑客技能是一项非常复杂和专业的技能&#xff0c;需要广泛的计算机知识和网络安全知识。你可以参考下面一些学习步骤&#xff0c;系统自学网络安全。 在学习之前&#xff0c;要给自己定一个目标或者思考一下要达到一个什么样的水平&#xff0c;是学完找工作&#xff08;…...

lua学习-2 常见运算符

文章目录 赋值运算符普通赋值多重赋值交换赋值 算数运算符常见符号标识 关系运算符常见符号标识TIP 逻辑运算符常见符号标识模拟三目运算 赋值运算符 普通赋值 a 1b "123"c truec "true"多重赋值 a,b 1,2 a,b,c 2,"ss" -- c的值为nil交换赋…...

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界&#xff0c;我们被图像和视频所包围。从社交媒体到广告&#xff0c;图像已成为一种强大的交流媒介。但是你有没有想过&#xff0c;如果你能把你的照片变成卡通会发生什么&#xff1f;想象一下&#xff0c;为您最喜欢的照片创建动画版本&#xf…...

暖手宝UL认证 亚马逊UL测试报告 UL499测试项目

UL499测试内容&#xff1a;1、 漏电流测试 2、 输入测试 3、 潮态下漏电流测试4、正常温升测试 5、 耐高压测试 6、 稳定性测试7、异常测试&#xff08;DRY&#xff09;8、 异常测试  9、 静压及强度测试10、 烧熔断器测试、 电源线拉力测试11、 电源线推力测试12、 塑件变…...

ES6模块化与异步编程高级用法

1. ES6模块化 1.1 回顾&#xff1a;node.js 中如何实现模块化 node.js 遵循了 CommonJS 的模块化规范。其中&#xff1a; 导入其它模块使用 require() 方法模块对外共享成员使用 module.exports 对象 模块化的好处&#xff1a; 大家都遵守同样的模块化规范写代码&#xff0…...

spring-cloud-starter-gateway 4.0.6负载均衡失败

spring:application:name: gatewaycloud:gateway:routes:- id: memberuri: lb://memberpredicates:- Path/member/**需要引入下面负载均衡依赖否则503找不到服务 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-s…...

Tomcat注册为Windows服务

要将Tomcat注册为Windows服务&#xff0c;可以使用Tomcat提供的实用工具service.bat。以下是注册和配置Tomcat作为Windows服务的步骤&#xff1a; 打开命令提示符&#xff08;Command Prompt&#xff09;或 PowerShell&#xff0c;然后进入Tomcat安装目录的"bin"文件…...

【Maven】Maven 中 pom.xml 文件

文章目录 前言什么是 pom&#xff1f;pom配置一览 1. dependencies2.scope3.properties4.plugin参考 前言 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建和管理依赖。 本文&#xff0c;我们认识下 pom.xml 文件。POM(Project Object Model&#xff0c; 项目…...

2、Linux驱动开发:模块_引用符号

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…...

Python web实战 | Docker+Nginx部署python Django Web项目详细步骤【干货】

概要 在这篇文章中&#xff0c;我将介绍如何使用 Docker 和 Nginx 部署 Django Web 项目。一步步讲解如何构建 Docker 镜像、如何编写 Docker Compose 文件和如何配置 Nginx。 1. Docker 构建 Django Web 项目 1.1 配置 Django 项目 在开始之前&#xff0c;我们需要有一个 D…...

【uniapp】实现买定离手小游戏

前言 最近玩了一个小游戏&#xff0c;感觉挺有意思&#xff0c;打算放进我的小程序【自动化小助手】里面&#xff0c;“三张押一张&#xff0c;专押花姑娘&#xff01;”&#xff0c;从三张卡牌&#xff0c;挑选一张&#xff0c;中奖后将奖励进行发放&#xff0c;并且创建下一…...

【vim 学习系列文章 3 - vim 选中、删除、复制、修改引号或括号内的内容】

文章目录 vim 快捷命令vim 操作符vim 文本对象vim 动作 上篇文章: vim 学习系列文章 2 - vim 常用插件配置 vim 快捷命令 Vim 有一个模块化的结构&#xff0c;允许你使用各种命令的组合操作。大多数命令有两个、三个或四个部分。三部分结构的一个版本是这样的&#xff1a;操作…...

webpack联邦模块介绍及在dumi中使用问题整理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ModuleFederationPlugin参数含义&#xff1f;二、如何在dumi中使用及问题整理1. 如何在dumi中使用(这个配置是好使的)2.相关问题整理2.1 问题12.2 问题2 总…...

记录一下Kotlin: Module was compiled with an incompatible version of Kotlin.的问题

我遇到的整个报错是这样的&#xff1a; Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.1.16. 大概意思就是不匹配&#xff0c;但是我这是个不太能随便改代码的项目&#x…...

html中使用Vue+element UI动态创建表单数据不显示问题

直接上代码&#xff1a;html代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&…...

CentOS下 Docker、Docker Compose 的安装教程

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker Compose是用于定义…...

[OnWork.Tools]系列 02-安装

下载地址 百度网盘 历史版本连接各种版本都有,请下载版本号最高的版本 链接&#xff1a;https://pan.baidu.com/s/1aOT0oUhiRO_L8sBCGomXdQ?pwdn159提取码&#xff1a;n159 个人链接 http://on8.top:5000/share.cgi?ssiddb2012fa6b224cd1b7f87ff5f5214910 软件安装 双…...

【外键合并python】

外键合并&#xff08;Foreign Key Merge&#xff09; 外键合并是指在数据库或者数据表中&#xff0c;通过共同的外键将多个数据表合并在一起的操作。在 Excel 表格中&#xff0c;我们可以使用外键来将多个表格合并&#xff0c;类似于数据库中的关联操作。 步骤一&#xff1a;…...

Mongodb SQL 到聚合映射快速参考

SQL 映射 聚合管道允许MongoDB 提供原生聚合功能&#xff0c;对应于 SQL 中许多常见的数据聚合操作。比如&#xff1a;GROUP BY、COUNT()、UNION ALL 测试数据 For MySQL rootlocalhost 14:40:40 [test]> select * from orders; -------------------------------------…...

腾讯云标准型S6/SA3/SR1/S5/SA2服务器CPU处理器大全

腾讯云服务器CVM标准型CPU处理器大全&#xff0c;包括标准型S6、SA3、SR1、S5、S5se、SA2、S4、SN3ne、S3、SA1、S2ne实例CPU处理器型号大全&#xff0c;标准型S6云服务器CPU采用Intel Ice Lake(2.7GHz/3.3GHz)&#xff0c;标准型S5采用Intel Xeon Cascade Lake 8255C/Intel Xe…...

idea 关于高亮显示与选中字符串相同的内容

dea 关于高亮显示与选中字符串相同的内容&#xff0c;本文作为个人备忘的同时也希望可以作为大家的参考。 依次修改File-settings-Editor-Color Scheme-General菜单下的Code-Identifier under caret和Identifier under caret(write)的Backgroud色值&#xff0c;可以参考下图。…...

【重点:单例模式】特殊类设计

请设计一个类&#xff0c;只能在堆上创建对象 方式如下&#xff1a; 将构造函数设置为私有&#xff0c;防止外部直接调用构造函数在栈上创建对象。向外部提供一个获取对象的static接口&#xff0c;该接口在堆上创建一个对象并返回。将拷贝构造函数设置为私有&#xff0c;并且…...

智能家居是否可与ChatGPT深度融合?

​ ChatGPT自2022年面世以来&#xff0c;已为亿万网民提供智能问答服务。然而我们是否曾想到&#xff0c;这一人工智能驱动的聊天机器人&#xff0c;是否可为智能家居赋能? 要实现ChatGPT与智能家居设备之间的无缝对话&#xff0c;单单依靠一台终端是远远不够的。ChatGPT必须…...