[NetCDF][C++] 使用NetCDF 的接口读取数值

wenjs00 2020-04-21

在这里介绍的是用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);

}

结果图:

[NetCDF][C++] 使用NetCDF 的接口读取数值[NetCDF][C++] 使用NetCDF 的接口读取数值

相关推荐