cmake c++ netcdf读取

c++读取netcdf

  1. 一维数据 读取维度例子
#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];
  }

  1. 二维数据 读取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;//注意删除此变量,不然可能会引起内存溢出

  1. 三维及以上

#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));

posted @   xiaomaixiaomai  阅读(285)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示