cmake c++ netcdf读取
c++读取netcdf
- 一维数据 读取维度例子
#include <Eigen/Dense>
#include "netcdfcpp.h"
#include "hdf5.h"
#include "H5Cpp.h"
NcFile dataFile(path, NcFile::read);
NcVar latitude = dataFile.getVar("latitude");
//获取维度大小
std::vector<NcDim> latdims = latitude.getDims();
int latnum = latdims[0].getSize();
float* latvar = new float[latnum];
latitude.getVar(latvar);
Eigen::VectorXd lat_dac; lat_dac.resize(latnum);
// cout << "latnum :" << latnum << endl;
for (size_t i = 0; i < latnum; i++)
{
lat_dac(i) = latvar[i];
}
- 二维数据 读取dac例子
#include <Eigen/Dense>
#include "netcdfcpp.h"
#include "hdf5.h"
#include "H5Cpp.h"
NcVarAtt scale;
NcVarAtt add;
NcFile dataFile(path, NcFile::read);
NcVar dac = dataFile.getVar("dac");
//获取经度大小
std::vector<NcDim> dacdims = dac.getDims();
std::map<std::string, NcVarAtt> dacattr = dac.getAtts();
int dacnum;
for (size_t i = 0; i < dacdims.size(); i++)
{
dacnum = dacdims[i].getSize();
}
double * dacvar = new double[latnum*lonnum];
//文件压缩,进行解压缩输出
scale = dacattr["scale_factor"];
if (!scale.isNull()) {
scale.getValues(&scale_factor);
}
add = dacattr["add_offset"];
if (!add.isNull()) {
add.getValues(&add_offset);
}
dac.getVar(dacvar);
dac_dac.resize(latnum, lonnum);
for (int i = 0; i < latnum; i++)
{
for (int j = 0; j < lonnum; j++)
{
dac_dac(i, j) = dacvar[i*latnum + j] * scale_factor + add_offset;
}
}
delete dacvar;//注意删除此变量,不然可能会引起内存溢出
- 三维及以上
#include <Eigen/Dense>
#include "netcdfcpp.h"
#include "hdf5.h"
#include "H5Cpp.h"
map<string, map<string, map<string, ArrayXXd>>> & alldata
NcVarAtt scale;
NcVarAtt add;
NcFile dataFile(path, NcFile::read);
NcVar r = dataFile.getVar("r");
std::vector<NcDim> rdims = r.getDims();
std::map<std::string, NcVarAtt> rattr = r.getAtts();
for (size_t i = 0; i < rdims.size(); i++)
{
lltnum *= rdims[i].getSize();
//cout << rdims[i].getSize() << endl;
}
//文件压缩,进行解压缩输出
scale = rattr["scale_factor"];
if (!scale.isNull()) {
scale.getValues(&scale_factor);
}
add = rattr["add_offset"];
if (!add.isNull()) {
add.getValues(&add_offset);
}
//cout << "scale_factor :" << scale_factor << endl;
//cout << "add_offset :" << add_offset << endl;
double* datavar = new double[lltnum];
r.getVar(datavar);
//按日期读取,生成集合
//按时间
map<string, map<string, ArrayXXd>> timemap;
for (size_t i1 = 0; i1 < timedata.size(); i1++)
{
string timnum = to_string(timedata[i1]);
// cout<<"timnum :"<< timnum <<endl;
//level的顺序分类存储
map<string, ArrayXXd> levelmap;
for (size_t j = 0; j < leveldata.size(); j++)
{
string levenum = to_string(leveldata(j));
// cout << "levenum :" << levenum << endl;
ArrayXXd data; data.resize(latnum, lonnum);
//lat 顺序
for (size_t k = 0; k < latdata.size(); k++)
{
//lon 顺序
for (size_t l = 0; l < londata.size(); l++)
{
data(k, l) = datavar[((i1*levelnum*latnum*lonnum) + (j*latnum*lonnum) + (k*lonnum) + l)] * scale_factor + add_offset;
// cout << fixed << setprecision(8) << l <<
// " :" << (i1*levelnum*latnum*lonnum) + (j*latnum*lonnum) + (k*lonnum) + l <<
// " :" << datavar[((i1*levelnum*latnum*lonnum) + (j*latnum*lonnum) + (k*lonnum) + l)] * scale_factor + add_offset << endl;
}
}
levelmap.insert(make_pair(levenum, data));
}
timemap.insert(make_pair(timnum, levelmap));
}
//释放内存
delete datavar;
alldata.insert(make_pair("r", timemap));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人