经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形、海洋表面温度、盐度、湿度、云场、风场等数据,除了地形数据是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. 安卓开发笔记(十九):异步消息处理机制实现更新软件UI

    主界面代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andr ...

  2. SQL Server的Linked Server支持使用SEQUENCE吗?

    SQL Server的Linked Server支持使用SEQUENCE吗?   SQL Server 2012开始支持序列(SEQUENCE),今天遇到有个同事咨询,能否在LINKED SERVER ...

  3. Storm入门(十二)Twitter Storm: DRPC简介

    作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/756/twitter-stor ...

  4. PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类. 类,属性和方法,类,对象,面向对象编程的三大特点.特点,封装性,继承性,多态性. 封装性 ...

  5. Dom4J配合XPath解析schema约束的xml配置文件问题

    如果一个xml文件没有引入约束,或者引入的是DTD约束时,那么使用dom4j和xpath是可以正常解析的,不引入约束的情况本文不再展示. 引入DTD约束的情况 mybook.dtd: <?xml ...

  6. body标签中l的相关标签

    字体标签: h1~h6.font. u.b,.strong. em. sup. sub 排版标签: div,.span.br.hr.center.pre 图片标签: img 超链接: a 列表标签: ...

  7. 记一次工作失误,openresty报502错误

    调试落地项目,代理跳转接口报502错误. 一开始认为阿里云tomcat有误,后面发现别的地址代理跳转有效. 开始配置跳转地址,一直折腾半天不好使.后面才知道,应用服务器和数据库服务器是分开部署的.一直 ...

  8. 常见的Python脚本

    1.冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport(): for i in range(len(lis)-1 ...

  9. cocos creator主程入门教程(十一)—— 有限状态机和行为树

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 本篇介绍有限状态机和行为树.有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个 ...

  10. Docker在Linux上运行NetCore系列(三)在Linux上使用Docker运行Asp.NetCore

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 开始说明 上几篇文章都是通过Linux运 ...