用Qt+NetCDF 读取NC文件

2024-04-17 16:20
文章标签 读取 qt nc netcdf

本文主要是介绍用Qt+NetCDF 读取NC文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用Qt+NetCDF 读取NC文件_ivqtnc-CSDN博客

基于NetCDF-CXX4 封装,对NC文件进行读取,读取内存放到vector中。

ncBase.h

#ifndef  __NC_BASE_H__
#define __NC_BASE_H__#include <QVariant>
#include <vector>
#include <map>
using namespace std;typedef std::vector<float> _dataVector_f;   //存放一维数据
typedef std::vector<double> _dataVector_d;   //存放一维数据
typedef std::vector<QString> _dataVector_s;   //存放一维数据
typedef std::vector<_dataVector_d> _3DDataVector_v;   //存放三维数据
typedef QPair<float, float> _Pos;Q_DECLARE_METATYPE(_dataVector_d)
Q_DECLARE_METATYPE(_3DDataVector_v)#endif

ncReader.h

#pragma once
#ifndef _NC_READER_H_
#define _NC_READER_H_#include "qfileinfo.h"
#include "ncBase.h"
#include <QMap>
#include <QString>
#include <Qvector>
#include <QFileInfo>
#include <QDir>
#include <QTimer>
#include <netcdfcpp.h>
#include "../../Z_PlantInterface/plantinterface.h"using namespace  std;
using  namespace netCDF;class ncReader :QObject
{Q_OBJECT
private:QString curFilePath;CPlantInterface* m_pInterface;NcFile *m_pDataFile{};
public:ncReader(QString filePath);~ncReader();void SetPlantInterface(CPlantInterface* pInterface) { m_pInterface = pInterface; };bool ReadData_D(_dataVector_d& vet_data, QString strEle, long l0 = -1, long l1 = -1, long l2 = -1, long l3 = -1, long l4 = -1);bool ReadData_F(_dataVector_f& vet_data, QString strEle, long l0 = -1, long l1 = -1, long l2 = -1, long l3 = -1, long l4 = -1);long *GetEleEdge(QString strElement);NcVar* GetVar(QString strEle);QString getfilePath();int  GetVarNums();void GetVars(_dataVector_s &vet_Vars);
};#endif

ncReader.cpp

#include"ncReader.h"
#include<qdebug.h>
#include <QPixmap>
#include <QFile>
#include <QDataStream>
#include <QApplication>
#include <QSettings>
#include <iostream>
#include <QDateTime>
#include <string.h>ncReader::ncReader(QString filePath) :curFilePath(filePath)
{//中文字符串转换std::string pathstr = filePath.toLocal8Bit();const char* temp = pathstr.c_str();m_pDataFile = new NcFile(temp, NcFile::read);//只读文件中的数据
}ncReader::~ncReader()
{}bool ncReader::ReadData_D(_dataVector_d& vet_data, QString strEle, long l0 /*=-1*/, long l1/*=-1*/, long l2/*=-1*/, long l3 /*= -1*/, long l4 /*= -1*/)
{if (m_pDataFile->isNull() || !m_pDataFile)return false;if (l0 < -1 || l1 < -1 || l2 < -1 || l3 < -1 || l4 < -1)return false;long lg0 = 1, lg1 = 1, lg2 = 1, lg3 = 1, lg4 = 1, lg5 = 1;long *p = GetEleEdge(strEle);NcVar pVar = m_pDataFile->getVar(strEle.toStdString().c_str());if (pVar.isNull())return false;int nDims = pVar.getDimCount();std::vector<size_t> vet_Inx;//存放每个维度上索引(开始位置)std::vector<size_t> vet_Count;//存放索引(数量) value >=1vet_Inx.clear();switch (nDims){case 1://1维{float* data = new float[p[0]];pVar.getVar(data);_dataVector_d vet_tmp(data, data + p[0]);vet_data.swap(vet_tmp);delete[]data;}break;case 2://2维{long long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Count.push_back(lg1);vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍vet_data.swap(vet_tmp);delete[]data;}break;case 3://3维{long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0]; vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1]; vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}if (l2 == -1){nLen *= p[2];lg2 = p[2]; vet_Inx.push_back(0);vet_Count.push_back(lg2);}else{vet_Inx.push_back(l2);vet_Count.push_back(1);}float fscale = 1.0f;float foffset = 0.0f;float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍if (fscale != 1.0f || foffset != 0.0f){int n = 0;for (auto it : vet_tmp){vet_tmp[n] = it * fscale + foffset;n++;}}vet_data.swap(vet_tmp);delete[]data;}break;case 4://4维{long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}if (l2 == -1){nLen *= p[2];lg2 = p[2];vet_Inx.push_back(0);vet_Count.push_back(lg2);}else{vet_Inx.push_back(l2);vet_Count.push_back(1);}if (l3 == -1){nLen *= p[3];lg3 = p[3];vet_Inx.push_back(0);vet_Count.push_back(lg3);}else{vet_Inx.push_back(l3);vet_Count.push_back(1);}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍vet_data.swap(vet_tmp);delete[]data;}break;case 5://5维{long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}if (l2 == -1){nLen *= p[2];lg2 = p[2];vet_Inx.push_back(0);vet_Count.push_back(lg2);}else{vet_Inx.push_back(l2);vet_Count.push_back(1);}if (l3 == -1){nLen *= p[3];lg3 = p[3];vet_Inx.push_back(0);vet_Count.push_back(lg3);}else{vet_Inx.push_back(l3);vet_Count.push_back(1);}if (l4 == -1){nLen *= p[4];lg4 = p[4];vet_Inx.push_back(0);vet_Count.push_back(lg4);}else{vet_Inx.push_back(l4);vet_Count.push_back(1);}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_d vet_tmp(data, data + nLen);//转存,效率提升170倍vet_data.swap(vet_tmp);delete[]data;}break;default:break;}
}bool ncReader::ReadData_F(_dataVector_f& vet_data, QString strEle, long l0 /*=-1*/, long l1/*=-1*/, long l2/*=-1*/, long l3 /*= -1*/, long l4 /*= -1*/)
{if (m_pDataFile->isNull() || !m_pDataFile)return false;if (l0 < -1 || l1 < -1 || l2 < -1 || l3 < -1 || l4 < -1)return false;long lg0 = 1, lg1 = 1, lg2 = 1, lg3 = 1, lg4 = 1, lg5 = 1;long *p = GetEleEdge(strEle);NcVar pVar = m_pDataFile->getVar(strEle.toStdString().c_str());if (pVar.isNull())return false;int nDims = pVar.getDimCount();std::map<std::string, NcVarAtt> map_atts = pVar.getAtts();//获取所有的属性,因为获取不存在的属性会崩溃std::vector<size_t> vet_Inx;//存放每个维度上索引(开始位置)std::vector<size_t> vet_Count;//存放索引(数量) value >=1vet_Inx.clear();switch (nDims){case 1://1维{float* data = new float[p[0]];pVar.getVar(data);_dataVector_f vet_tmp(data, data + p[0]);vet_data.swap(vet_tmp);delete []data;}break;case 2://2维{long long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Count.push_back(lg1);vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_f vet_tmp(data, data + nLen);//转存,效率提升170倍vet_data.swap(vet_tmp);delete[]data;}break;case 3://3维{long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}if (l2 == -1){nLen *= p[2];lg2 = p[2];vet_Inx.push_back(0);vet_Count.push_back(lg2);}else{vet_Inx.push_back(l2);vet_Count.push_back(1);}//查看压缩值float fscale = 1.0f;float foffset = 0.0f;if (map_atts.find("scale_factor") != map_atts.end()){NcVarAtt AttT = pVar.getAtt("scale_factor");if (!AttT.isNull()){NcType TypeId = AttT.getType();if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)AttT.getValues(&fscale);}}if (map_atts.find("add_offset") != map_atts.end()){NcVarAtt AttS = pVar.getAtt("add_offset");if (!AttS.isNull()){NcType TypeId = AttS.getType();if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)AttS.getValues(&foffset);}}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_f vet_tmp(data, data + nLen);//转存if (fscale != 1.0f || foffset != 0.0f){int n = 0;for (auto it : vet_tmp){vet_tmp[n] = it * fscale + foffset;n++;}}vet_data.swap(vet_tmp);delete[]data;}break;case 4://4维{long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}if (l2 == -1){nLen *= p[2];lg2 = p[2];vet_Inx.push_back(0);vet_Count.push_back(lg2);}else{vet_Inx.push_back(l2);vet_Count.push_back(1);}if (l3 == -1){nLen *= p[3];lg3 = p[3];vet_Inx.push_back(0);vet_Count.push_back(lg3);}else{vet_Inx.push_back(l3);vet_Count.push_back(1);}//查看压缩值float fscale = 1.0f;float foffset = 0.0f;if (map_atts.find("scale_factor") != map_atts.end()){NcVarAtt AttT = pVar.getAtt("scale_factor");if (!AttT.isNull()){NcType TypeId = AttT.getType();if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)AttT.getValues(&fscale);}}if (map_atts.find("add_offset") != map_atts.end()){NcVarAtt AttS = pVar.getAtt("add_offset");if (!AttS.isNull()){NcType TypeId = AttS.getType();if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)AttS.getValues(&foffset);}}//默认填充值float fFillVaue = 0.0f;if (map_atts.find("_FillValue") != map_atts.end()){NcVarAtt AttF = pVar.getAtt("_FillValue");if (!AttF.isNull()){NcType TypeId = AttF.getType();if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE || TypeId == NC_SHORT)AttF.getValues(&fFillVaue);}}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_f vet_tmp(data, data + nLen);//转存int n = 0;for (auto it : vet_tmp){if (fabs(it - fFillVaue) < 0.000001){//not vaild valuevet_tmp[n] = 9999;}else if (fscale != 1.0f || foffset != 0.0f){vet_tmp[n] = it * fscale + foffset;}n++;}vet_data.swap(vet_tmp);delete[]data;}break;case 5://5维{	long nLen = 1;if (l0 == -1){nLen *= p[0];lg0 = p[0];vet_Inx.push_back(0);vet_Count.push_back(lg0);}else{vet_Inx.push_back(l0);vet_Count.push_back(1);}if (l1 == -1){nLen *= p[1];lg1 = p[1];vet_Inx.push_back(0);vet_Count.push_back(lg1);}else{vet_Inx.push_back(l1);vet_Count.push_back(1);}if (l2 == -1){nLen *= p[2];lg2 = p[2];vet_Inx.push_back(0);vet_Count.push_back(lg2);}else{vet_Inx.push_back(l2);vet_Count.push_back(1);}if (l3 == -1){nLen *= p[3];lg3 = p[3];vet_Inx.push_back(0);vet_Count.push_back(lg3);}else{vet_Inx.push_back(l3);vet_Count.push_back(1);}if (l4 == -1){nLen *= p[4];lg4 = p[4];vet_Inx.push_back(0);vet_Count.push_back(lg4);}else{vet_Inx.push_back(l4);vet_Count.push_back(1);}float* data = new float[nLen];pVar.getVar(vet_Inx, vet_Count, data);_dataVector_f vet_tmp(data, data + nLen);vet_data.swap(vet_tmp);delete[]data;}break;default:break;}return true;
}long* ncReader::GetEleEdge(QString strElement)
{long *p = NULL;if (m_pDataFile->isNull() ||!m_pDataFile)return p;NcVar pVar = m_pDataFile->getVar(strElement.toStdString().c_str());if (pVar.isNull())return p;int nLen = pVar.getDimCount();if (nLen <= 0)return p;p = new long[nLen];for (int n = 0; n < nLen; n++){int nSize = pVar.getDim(n).getSize();p[n] = nSize;}return p;
}NcVar* ncReader::GetVar(QString strEle)
{if (m_pDataFile)return &(m_pDataFile->getVar(strEle.toStdString().c_str()));return nullptr;
}QString ncReader::getfilePath()
{return curFilePath;
}int ncReader::GetVarNums()
{if (m_pDataFile)return m_pDataFile->getDimCount();return 0;
}void ncReader::GetVars(_dataVector_s &vet_Vars)
{if (!m_pDataFile)return;vet_Vars.clear();std::multimap<std::string, NcDim> dims = m_pDataFile->getDims();int nIndex = 0;for (auto it : dims){vet_Vars.push_back(QString::fromStdString(it.first));nIndex++;}
}

这篇关于用Qt+NetCDF 读取NC文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912283

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.