zoukankan      html  css  js  c++  java
  • [NetCDF][C++] 使用NetCDF 的接口读取数值

    这里有c读取的文章:https://www.baidu.com/link?url=GkjbSzGvEKWyIgCzcdRXLIkQtoDcoSsuivVisnXOrN88IhRVGZYFc00tvrqUxECWbe0zfUVbJFsw3XCOur9sQYDefviIR_PMNQAli371atK&wd=&eqid=d65745f100041aac000000045ea55483

    在这里介绍的是用NetCDF(c++接口)读取NC文件信息,主要包括NC文件里的维度与变量,我用的VS2015+Qt+NetCDF进行读取的,至于这个环境的配置可以参考我的上一篇文章,在这里我就不介绍环境的配置了。不过你也可用VS+NetCDF进行读取,把结果展示在控制台窗口内,我用Qt的目的是为了将读取结果展示在一个表格控件内。

    1.首先读取文件

    QString filename = QFileDialog::getOpenFileName(this, "开打文件", ".", "*.nc");
    	if (filename.isEmpty())
    	{
    		QMessageBox::information(this, "提示", "文件指针为空"); return;
    	}
    	NcFile dataFile(filename.toStdString(), NcFile::read);

    2.读取维度

    //维度操作
    	multimap<string, NcDim> group_dim;
    	group_dim = dataFile.getDims();
    	multimap<string, NcDim>::iterator it_dim;
    	it_dim = group_dim.begin();
    	int row_dim = 0;
    	for (; it_dim != group_dim.end(); it_dim++)
    	{       //读取维度的ID
    		int id = it_dim->second.getId();
    		QString txt_id = QString::number(id);
    		tableV_dim->setItem(row_dim, 0, new QStandardItem(txt_id));
                    //读取维度的名称
    		string name = it_dim->second.getName();
    		QString txt_name = QString::fromStdString(name);
    		tableV_dim->setItem(row_dim, 1, new QStandardItem(txt_name));
                    //读取维度的长度
    		int size = it_dim->second.getSize();
    		QString txt_size = QString::number(size);
    		tableV_dim->setItem(row_dim, 2, new QStandardItem(txt_size));
    		row_dim++;
    	}
        //设置表格的Model
    	ui.tableView_dim->setModel(tableV_dim);

    上面的tableView_dim是我自定义的QStandardItemModel;

    3.读取变量

    //变量操作
    	std::multimap<string, NcVar> group_var;
    	group_var = dataFile.getVars();
    	std::multimap<string, NcVar>::iterator it_var;
    	it_var = group_var.begin();
    	int row = 0;
    	for (; it_var != group_var.end(); it_var++)
    	{	//读取变量ID
    		int id = it_var->second.getId();
    		QString txt_id = QString::number(id);
    		tableV_var->setItem(row, 0, new QStandardItem(txt_id));
    		//读取变量名称
    		string name = it_var->second.getName();
    		QString txt_name = QString::fromStdString(name);
    		tableV_var->setItem(row, 1, new QStandardItem(txt_name));
    		//读取变量类型
    		string type = it_var->second.getType().getName();
    		QString txt_type = QString::fromStdString(type);
    		tableV_var->setItem(row, 2, new QStandardItem(txt_type));
    		//读取变量所拥有的维度名称
    		int dim = it_var->second.getDimCount();
    		QString txt_dim = QString::number(dim);
    		tableV_var->setItem(row, 3, new QStandardItem(txt_dim));
    
    		string name_dim = "";
    		for (int i = 0; i < it_var->second.getDimCount(); i++)
    		{
    			NcDim dim = it_var->second.getDim(i);
    			if (i == 0)
    			{
    				name_dim = name_dim + dim.getName();
    			}
    			else
    			{
    				name_dim = name_dim + " , " + dim.getName();
    			}
    
    		}
    		QString txt_name_dim = QString::fromStdString(name_dim);
    		tableV_var->setItem(row, 4, new QStandardItem(txt_name_dim));
    
    		row++;
    	}

    附上一个打开NC文件并读入一个表格内的完整函数

    void NC_show::act_tool_open_triggered()
    {
    	QString filename = QFileDialog::getOpenFileName(this, "开打文件", ".", "*.nc");
    
    	if (filename.isEmpty())
    	{
    		QMessageBox::information(this, "提示", "文件指针为空"); return;
    	}
    	NcFile dataFile(filename.toStdString(), NcFile::read);
    
    	//维度操作
    	multimap<string, NcDim> group_dim;
    	group_dim = dataFile.getDims();
    	multimap<string, NcDim>::iterator it_dim;
    	it_dim = group_dim.begin();
    	int row_dim = 0;
    	for (; it_dim != group_dim.end(); it_dim++)
    	{
    		int id = it_dim->second.getId();
    		QString txt_id = QString::number(id);
    		tableV_dim->setItem(row_dim, 0, new QStandardItem(txt_id));
    
    		string name = it_dim->second.getName();
    		QString txt_name = QString::fromStdString(name);
    		tableV_dim->setItem(row_dim, 1, new QStandardItem(txt_name));
    
    		int size = it_dim->second.getSize();
    		QString txt_size = QString::number(size);
    		tableV_dim->setItem(row_dim, 2, new QStandardItem(txt_size));
    		row_dim++;
    	}
    	ui.tableView_dim->setModel(tableV_dim);
    	//变量操作
    	std::multimap<string, NcVar> group_var;
    	group_var = dataFile.getVars();
    	std::multimap<string, NcVar>::iterator it_var;
    	it_var = group_var.begin();
    	int row = 0;
    	for (; it_var != group_var.end(); it_var++)
    	{	//读取变量ID
    		int id = it_var->second.getId();
    		QString txt_id = QString::number(id);
    		tableV_var->setItem(row, 0, new QStandardItem(txt_id));
    		//读取变量名称
    		string name = it_var->second.getName();
    		QString txt_name = QString::fromStdString(name);
    		tableV_var->setItem(row, 1, new QStandardItem(txt_name));
    		//读取变量类型
    		string type = it_var->second.getType().getName();
    		QString txt_type = QString::fromStdString(type);
    		tableV_var->setItem(row, 2, new QStandardItem(txt_type));
    		//读取变量所拥有的维度名称
    		int dim = it_var->second.getDimCount();
    		QString txt_dim = QString::number(dim);
    		tableV_var->setItem(row, 3, new QStandardItem(txt_dim));
    
    		string name_dim = "";
    		for (int i = 0; i < it_var->second.getDimCount(); i++)
    		{
    			NcDim dim = it_var->second.getDim(i);
    			if (i == 0)
    			{
    				name_dim = name_dim + dim.getName();
    			}
    			else
    			{
    				name_dim = name_dim + " , " + dim.getName();
    			}
    
    		}
    		QString txt_name_dim = QString::fromStdString(name_dim);
    		tableV_var->setItem(row, 4, new QStandardItem(txt_name_dim));
    
    		row++;
    	}
    
    	ui.tableView_var->setModel(tableV_var);
    
    }

    结果图:

  • 相关阅读:
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    实验 3:Mininet 实验——测量路径的损耗率
    软件工程第一次作业
    实验 2:Mininet 实验——拓扑的命令脚本生成
    实验 1:Mininet 源码安装和可视化拓扑工具
    软件工程第一次作业
    软工实践个人总结
    2020软工第二次结对作业
  • 原文地址:https://www.cnblogs.com/lyggqm/p/12748784.html
Copyright © 2011-2022 走看看