经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形、海洋表面温度、盐度、湿度、云场、风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据。本文将以海洋风场数据为例,进行nc格式文件的读取。

海洋风场数据(ccmp_wind)一般情况下会包含三个数据集:第一个数据集是uwnd(standard_name = "eastward_wind"),第二个数据集是vwnd(standard_name = "northward_wind"),第三个数据集是nobs或者wspd。前两个数据集是矢量数据,表示此处的风场方向最后一个数据集是标量数据,代表此处的风速。每个数据集中数据的存储又分为四个波段(也可以说是图层),一天的观测时间分为四个时间点,所以有四个图层。

GDAL库可以提供对nc格式数据的读取,本次数据的读取是在qt+vs2017环境下配置gdal库和netcdf库,环境的配置可以在网上找到,GDAL库的配置可以根据《GDAL源码剖析和开发指南》书中的内容进行编译和配置,配置完成后就可以运行数据,读取nc文件。

数据读取的代码如下:

头文件:

 #ifndef CCMPFILEREAD_H
#define CCMPFILEREAD_H
class ccmpFileRead
{
public:
void ccmpFileRead::fileread(const char*ccmpFilename);
}; #endif // CCMPFILEREAD_H

源文件:

 #include "ccmpfileread.h"

 #include <gdal_priv.h>
#include <vector>
#include <QVector> #include <string>
#include <QString>
#include <QStringList>
#include <QDebug> #include <fstream> using namespace std; void ccmpFileRead::fileread(const char *ccmpFilename)
{
vector <string> vFileSets;
vector <string> pStrDesc;
vector<vector<float>> allSSTPixelNum1,allSSTPixelNum2,allSSTPixelNum3; GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//中文路径
GDALDataset* fileDataset = (GDALDataset*) GDALOpen(ccmpFilename,GA_ReadOnly);//打开HDF数据集
if (fileDataset == NULL)
{
return;
} char** sublist = GDALGetMetadata((GDALDatasetH) fileDataset,"SUBDATASETS");//获得数据的字符串,可以打印出来看看自己需要的数据在那 int iCount = CSLCount(sublist);
if(iCount <= ){
qDebug() << "该文件没有子数据" << endl;
GDALClose((GDALDriverH)fileDataset);
} //存储数据集信息
for(int i = ; sublist[i] != NULL;i++)
{ qDebug() << sublist[i] << endl; if(i% != )
{
continue;
} //三个数据集:uwnd vwnd wspd 只读取前两个数据集,第三个数据集是补充数据集 string tmpstr = sublist[i];
tmpstr = tmpstr.substr(tmpstr.find_first_of("=")+);
const char *tmpc_str = tmpstr.c_str(); string tmpdsc = sublist[i+];
tmpdsc = tmpdsc.substr(tmpdsc.find_first_of("=")+); GDALDataset* hTmpDt = (GDALDataset*)GDALOpen(tmpc_str,GA_ReadOnly);//打开该数据 if (hTmpDt != NULL)
{
vFileSets.push_back(tmpc_str);
}
if(&pStrDesc != NULL){
pStrDesc.push_back(tmpdsc);
}
GDALClose(hTmpDt);
} //三个数据集分别读取 qDebug() << "read uwnd ......" << endl; QString qtmpdsc1 = QString::fromStdString(pStrDesc[]);//锁定某一个数据集 qDebug()<<qtmpdsc1<<endl; float *lineData = NULL;
if (qtmpdsc1!=NULL)
{
GDALDataset *tempDt = (GDALDataset *)GDALOpen(vFileSets[].data(), GA_ReadOnly);
int BandNum = tempDt->GetRasterCount(); int panBandmap[] ={};
lineData = new float[ * *];
tempDt->RasterIO(GF_Read,,,,,lineData,,,GDT_Float32,,panBandmap,,,); for (int iLine = ; iLine <tempDt->GetRasterYSize(); iLine++)
{
allSSTPixelNum1.resize(tempDt->GetRasterYSize());
for (int iPixel = ; iPixel < tempDt->GetRasterXSize(); iPixel++)
{
allSSTPixelNum1[iLine].resize(tempDt->GetRasterXSize());
tempDt->RasterIO(GF_Read, , iLine, tempDt->GetRasterXSize(), ,lineData, tempDt->GetRasterXSize(), , GDT_Float32, , panBandmap,,,);
allSSTPixelNum1[iLine][iPixel] = lineData[iPixel];
} }
if(lineData)
{
delete[]lineData;
lineData = NULL;
} qDebug() << "uwnd read over!" << endl; qDebug() <<"uwnd="<<'\n'<<allSSTPixelNum1[]<<'\n'<<endl; } //d读取vwnd数据集 QString qtmpdsc2 = QString::fromStdString(pStrDesc[]); if (qtmpdsc2!=NULL)
{
GDALDataset *tempDt = (GDALDataset *)GDALOpen(vFileSets[].data(), GA_ReadOnly);
int BandNum = tempDt->GetRasterCount();
qDebug()<<BandNum<<endl;
int panBandmap[] ={};
lineData = new float[ * *];
tempDt->RasterIO(GF_Read,,,,,lineData,,,GDT_Float32,,panBandmap,,,); for (int iLine = ; iLine <tempDt->GetRasterYSize(); iLine++)
{
allSSTPixelNum2.resize(tempDt->GetRasterYSize());
for (int iPixel = ; iPixel < tempDt->GetRasterXSize(); iPixel++)
{
allSSTPixelNum2[iLine].resize(tempDt->GetRasterXSize());
tempDt->RasterIO(GF_Read, , iLine, tempDt->GetRasterXSize(), ,lineData, tempDt->GetRasterXSize(), , GDT_Float32, , panBandmap,,,);
allSSTPixelNum2[iLine][iPixel] = lineData[iPixel];
} }
if(lineData)
{
delete[]lineData;
lineData = NULL;
} qDebug() << "vwnd read over!" << endl; qDebug() <<"vwnd="<<'\n'<<allSSTPixelNum2[]<<'\n'<<endl; } //读取wspd数据 QString qtmpdsc3 = QString::fromStdString(pStrDesc[]); if (qtmpdsc3!=NULL)
{
GDALDataset *tempDt = (GDALDataset *)GDALOpen(vFileSets[].data(), GA_ReadOnly);
int BandNum = tempDt->GetRasterCount();
qDebug()<<BandNum<<endl;
int panBandmap[] ={};
lineData = new float[ * *];
tempDt->RasterIO(GF_Read,,,,,lineData,,,GDT_Float32,,panBandmap,,,); for (int iLine = ; iLine <tempDt->GetRasterYSize(); iLine++)
{
allSSTPixelNum3.resize(tempDt->GetRasterYSize());
for (int iPixel = ; iPixel < tempDt->GetRasterXSize(); iPixel++)
{
allSSTPixelNum3[iLine].resize(tempDt->GetRasterXSize());
tempDt->RasterIO(GF_Read, , iLine, tempDt->GetRasterXSize(), ,lineData, tempDt->GetRasterXSize(), , GDT_Float32, , panBandmap,,,);
allSSTPixelNum3[iLine][iPixel] = lineData[iPixel];
} } if(lineData)
{
delete[]lineData;
lineData = NULL;
} qDebug() << "wspd read over!" << endl; qDebug() <<"wspd="<<'\n'<<allSSTPixelNum3[]<<'\n'<<endl; GDALClose((GDALDatasetH)tempDt); } GDALClose((GDALDriverH)fileDataset);
}

主函数调用:

 #include <QCoreApplication>
#include <ccmpfileread.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ccmpFileRead a1;
a1.fileread("E:/odp_workplace/odp_data/testdata/CCMP_Wind_Analysis_198707_V02.0_L3.5_RSS.nc");
return a.exec();
}

输出结果:

如上图所示数据已经读取并显示成功。

基于GDAL库,读取海洋风场数据(.nc格式)c++版的更多相关文章

  1. 基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  2. 关于基于GDAL库QT软件平台下C++语言开发使用说明

    背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提 ...

  3. 利用 pandas库读取excel表格数据

    利用 pandas库读取excel表格数据 初入IT行业,愿与大家一起学习,共同进步,有问题请指出!! 还在为数据读取而头疼呢,请看下方简洁介绍: 数据来源为国家统计局网站下载: 具体方法 代码: i ...

  4. 基于从库+binlog方式恢复数据

    基于从库+binlog方式恢复数据 将bkxt从库的全备份在rescs5上恢复一份,恢复到6306端口,用cmdb操作 恢复全备后执行如下操作 set global read_only=OFF; st ...

  5. 基于GDAL库,读取.nc文件(以海洋表温数据为例)C++版

    对于做海洋数据处理的同学,会经常遇到nc格式的文件,nc文件的格式全称是NetCDF,具体的详细解释请查询官网[https://www.unidata.ucar.edu/software/netcdf ...

  6. 基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  7. 基于GDAL库海洋表温日平均计算工具设计与实现 C++版

    技术背景 在对物理海洋数据处理过程中,表层温度是众多要素中的一种,本文书要是针对海洋表温数据批量日平均处理的一个工具设计.首先要在对当前的SST数据文件作一下简要的说明,SST全称为sea surfe ...

  8. C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

    部分源码选自GDAL库的官方网址:www.gdal.org,其余的代码为笔者自己编写. // readfile.cpp : 定义控制台应用程序的入口点. // /* part of the codes ...

  9. GDAL库——读取图像并提取基本信息

    GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL ...

随机推荐

  1. 使用async await 封装 axios

    异步变同步: 厉害-- https://www.jianshu.com/p/4168efdc172b

  2. 判断HTML中的checkbox是否被选中

    //合法性验证 function checkValidity() { var userNameCheck = $("#userNameCheck").attr('checked') ...

  3. Luogu P5309 [Ynoi2012]D1T1

    小清新分块题,从头到尾都十分套路,和CXR大佬一起YY了一下就出来了 首先套路地设个阈值\(S\),把修改的\(x\)分成大于\(S\)和小于等于\(S\)两部分,然后我们考虑分别求解这两部分 \(x ...

  4. 深入理解this关键字

    Java提供了一个this关键字,this关键字总是指向调用该方法的对象.根据this出现的位置的不同,this作为对象的默认引用有两种情形. 1)构造器中引用该构造器正在初始化的对象. 2)在方法中 ...

  5. Servlet不再是烦恼

    Servlet 一.什么是Servlet? Servlet是在服务器上运行的小程序,也就是一个Java类,但比较特殊,不需要new,自动就可以运行.也有创建.垃圾回收和销毁过程.Servlet是Jav ...

  6. 每日分享!~ vue JavaScript中为什么可以读取到字符串的长度!(包装对象)

    首先需要知道什么是包装对象? 对象是JavaScript语言下最主要的数据类型,三种原始的值-----数值,字符串,布尔值,在一定条件下会自动的转为对象.也就是原始类型的包装对象: 也就是通过如下方式 ...

  7. Python后台开发Django( 模板 与 值匹配 )

    模板文件(templates) 在setting.py中,设置模板存放位置 在APP中view的使用 from django.shortcuts import render #导入 def homex ...

  8. 【activity任务栈】浅析

    背景知识 Activity四种启动模式 标准模式 standard 栈顶复用模式 singleTop 栈内复用模式 singleTask 单例模式 singleInstance 任务栈 Activit ...

  9. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

  10. 『集群』002 Slithice 集群配置工具 的使用

    Slithice 集群配置工具 的使用 Slithice集群配置工具 主界面 在测试 Slithice 的 Demo 中,我配置了 7个服务端: 一个 WCF 的 中央服务端: 两个 WCF 的 成员 ...