用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中基于GeoTools的Shapefile读取乱码的问题

《解决Java中基于GeoTools的Shapefile读取乱码的问题》本文主要讨论了在使用Java编程语言进行地理信息数据解析时遇到的Shapefile属性信息乱码问题,以及根据不同的编码设置进行属... 目录前言1、Shapefile属性字段编码的情况:一、Shp文件常见的字符集编码1、System编码

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用