经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形、海洋表面温度、盐度、湿度、云场、风场等数据,除了地形数据是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. mysql7笔记----遍历节点所有子节点

    mysql遍历节点的所有子节点 DELIMITER // CREATE FUNCTION `getChildrenList`(rootId INT) ) BEGIN ); ); SET sTemp = ...

  2. C语言中的位段(位域)知识

    在结构体或类中,为了节省成员的存储空间,可以定义某些由位组成的字段,这些字段可以不需要以byte为单位. 这些不同位长度的字段实际存储于一个或多个整形变量.位段成员必须声明为int, signed i ...

  3. python 基础语法梳理(二)

    1.gevent使用 # -*- coding: utf-8 -*- import gevent import platform from gevent import subprocess def _ ...

  4. 知识科普:IM聊天应用是如何将消息发送给对方的?(非技术篇)

    1.引言 沟通是人类的最基本需求,复杂多变的沟通内容.沟通方式,正是人类文明之所以如此璀璨的关键所在.   在自然界中,要完成一件事情的沟通,我们可以直接通过声音传递给对方,这是再平常不过的事了(靠“ ...

  5. PHP全栈学习笔记8

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

  6. XML的创建、解析-C语言

    前言:今天在做一个小项目时,客户要求的xml,跟现在有系统要求的不一样,所以要自己重新写函数支持返回,进行简单总结,希望对大家有所帮助. 首先,使用xml函数需要链上动态库libxml2,需要在电脑上 ...

  7. Python:黑板课爬虫闯关第三关

    第三关开始才算是进入正题了. 输入网址 http://www.heibanke.com/lesson/crawler_ex02/,直接跳转到了 http://www.heibanke.com/acco ...

  8. C++求集合的交集差集

    标准库的<algorithm>头文件中提供了std::set_difference,std::set_intersection和std::set_union用来求两个集合的差集,交集和并集 ...

  9. SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

  10. 将配置文件appsetting中的值转换为动态对象调用

    该文可参考我的另一篇关联文章:   https://www.cnblogs.com/lxhbky/p/6957825.html 配置如下: <!--邀请用户送优惠券规则{邀请人规则:[{邀请人: ...