经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形、海洋表面温度、盐度、湿度、云场、风场等数据,除了地形数据是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. 运维DBA要不要学python

    运维DBA要不要学python 我个人认为是:要 现在python在运维数据库的工作中主要用在 1.编写一些运维脚本 2.编写运维管理平台 3.研究互联网大厂的运维脚本/工具并应有 特别是运维开源数据 ...

  2. Nginx下载服务器配置文件

    server { listen 8080; server_name localhost; #charset koi8-r; charset utf-8; #access_log logs/host.a ...

  3. 解决WIN7启动DHCP服务报1075错误办法

    昨天电脑装了Microsoft .NET Framework后,今天一开电脑连不上网了,找了半天问题发现电脑的DHCP服务没有开启,然后在服务中开发DHCP提示下面的内容 原文地址:代码汇个人博客 h ...

  4. CMake简介

    目录 一.CMake简介 二.CMake典型示例 源代码 demo.cpp cmake脚本 CMakeLists.txt 编译流程 三.CMake常用命令 常用命令介绍 设置编译目标类型 指定编译包含 ...

  5. WaitGroup

    WaitGroup在go语言中,用于线程同步,单从字面意思理解,wait等待的意思,group组.团队的意思,WaitGroup就是指等待一组,等待一个系列执行完成后才会继续向下执行. 先说说Wait ...

  6. Spring Boot 2.2 增加了一个新功能,启动飞起~

    前几天栈长分享了一个好玩的框架:一个比Spring Boot快44倍的Java框架!,是不是感觉 Spring Boot 略慢?今天讲一下 Spring Boot 添加的这个新特性,可以大大提升 Sp ...

  7. 为什么分库分表使用2的N次方 一个字节用两位16进制

    你说说为神马表的总数.redis库的总数.HashMap的数量最好是2的N次方 数据在表库HashMap 落地时候都会跟总数取模,这个我们做个测试 假设数量是2的3次方就是8,即索引就是0-7 php ...

  8. 数据库连接(1)-从JDBC到MyBatis

    摘要 因为有持久层框架,和Spring的存在,越来越多的人对数据库连接这块不甚了解,只知使用方便,不知其原理.所以写一个数据库连接的系列文章,总结下本人在数据库连接方面遇到的问题,和对数据库连接的理解 ...

  9. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  10. mysql的学习笔记(四)

    ---恢复内容开始--- 1.插入操作 INSERT (1)INSERT table_name(col_name,...) VALUES(...),(....) CREATE TABLE user( ...