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

数据读取的代码如下:

头文件:

 1 #ifndef CCMPFILEREAD_H
 2 #define CCMPFILEREAD_H
 3 class ccmpFileRead
 4 {
 5 public:
 6     void ccmpFileRead::fileread(const char*ccmpFilename);
 7 };
 8
 9
10
11 #endif // CCMPFILEREAD_H

源文件:

  1 #include "ccmpfileread.h"
  2
  3 #include <gdal_priv.h>
  4 #include <vector>
  5 #include <QVector>
  6
  7 #include <string>
  8 #include <QString>
  9 #include <QStringList>
 10 #include <QDebug>
 11
 12 #include <fstream>
 13
 14 using namespace std;
 15
 16 void ccmpFileRead::fileread(const char *ccmpFilename)
 17 {
 18     vector <string>         vFileSets;
 19     vector <string>         pStrDesc;
 20     vector<vector<float>>   allSSTPixelNum1,allSSTPixelNum2,allSSTPixelNum3;
 21
 22
 23     GDALAllRegister();
 24     CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//中文路径
 25     GDALDataset* fileDataset = (GDALDataset*) GDALOpen(ccmpFilename,GA_ReadOnly);//打开HDF数据集
 26     if (fileDataset == NULL)
 27     {
 28         return;
 29     }
 30
 31     char** sublist = GDALGetMetadata((GDALDatasetH) fileDataset,"SUBDATASETS");//获得数据的字符串,可以打印出来看看自己需要的数据在那
 32
 33     int iCount = CSLCount(sublist);
 34     if(iCount <= 0){
 35         qDebug() << "该文件没有子数据" << endl;
 36         GDALClose((GDALDriverH)fileDataset);
 37     }
 38
 39     //存储数据集信息
 40     for(int i = 0; sublist[i] != NULL;i++)
 41     {
 42
 43         qDebug() << sublist[i] << endl;
 44
 45         if(i%2 != 0)
 46         {
 47             continue;
 48         }
 49
 50         //三个数据集:uwnd vwnd wspd 只读取前两个数据集,第三个数据集是补充数据集
 51
 52         string tmpstr = sublist[i];
 53         tmpstr = tmpstr.substr(tmpstr.find_first_of("=")+1);
 54         const char *tmpc_str = tmpstr.c_str();
 55
 56         string tmpdsc = sublist[i+1];
 57         tmpdsc = tmpdsc.substr(tmpdsc.find_first_of("=")+1);
 58
 59         GDALDataset* hTmpDt = (GDALDataset*)GDALOpen(tmpc_str,GA_ReadOnly);//打开该数据
 60
 61         if (hTmpDt != NULL)
 62         {
 63             vFileSets.push_back(tmpc_str);
 64         }
 65         if(&pStrDesc != NULL){
 66             pStrDesc.push_back(tmpdsc);
 67         }
 68         GDALClose(hTmpDt);
 69     }
 70
 71
 72 //三个数据集分别读取
 73
 74     qDebug() << "read uwnd ......" << endl;
 75
 76     QString qtmpdsc1 = QString::fromStdString(pStrDesc[0]);//锁定某一个数据集
 77
 78     qDebug()<<qtmpdsc1<<endl;
 79
 80     float *lineData = NULL;
 81     if (qtmpdsc1!=NULL)
 82     {
 83         GDALDataset  *tempDt = (GDALDataset *)GDALOpen(vFileSets[0].data(), GA_ReadOnly);
 84                int BandNum = tempDt->GetRasterCount();
 85
 86                int panBandmap[1] ={1};
 87                lineData = new float[1 * 200*200];
 88           tempDt->RasterIO(GF_Read,508,112,32,24,lineData,50,50,GDT_Float32,1,panBandmap,0,0,0);
 89
 90
 91            for (int iLine = 0; iLine <tempDt->GetRasterYSize(); iLine++)
 92             {
 93                  allSSTPixelNum1.resize(tempDt->GetRasterYSize());
 94             for (int iPixel = 0; iPixel < tempDt->GetRasterXSize(); iPixel++)
 95              {
 96                   allSSTPixelNum1[iLine].resize(tempDt->GetRasterXSize());
 97                   tempDt->RasterIO(GF_Read, 0, iLine, tempDt->GetRasterXSize(), 1,lineData, tempDt->GetRasterXSize(), 1, GDT_Float32, 1, panBandmap,0,0,0);
 98                   allSSTPixelNum1[iLine][iPixel] = lineData[iPixel];
 99                 }
100
101            }
102            if(lineData)
103              {
104             delete[]lineData;
105             lineData = NULL;
106               }
107
108            qDebug() << "uwnd read over!" << endl;
109
110            qDebug() <<"uwnd="<<'\n'<<allSSTPixelNum1[200]<<'\n'<<endl;
111
112         }
113
114     //d读取vwnd数据集
115
116     QString qtmpdsc2 = QString::fromStdString(pStrDesc[2]);
117
118     if (qtmpdsc2!=NULL)
119     {
120         GDALDataset  *tempDt = (GDALDataset *)GDALOpen(vFileSets[0].data(), GA_ReadOnly);
121                int BandNum = tempDt->GetRasterCount();
122                qDebug()<<BandNum<<endl;
123                int panBandmap[1] ={1};
124                lineData = new float[1 * 200*200];
125           tempDt->RasterIO(GF_Read,508,112,32,24,lineData,50,50,GDT_Float32,1,panBandmap,0,0,0);
126
127
128            for (int iLine = 0; iLine <tempDt->GetRasterYSize(); iLine++)
129             {
130                  allSSTPixelNum2.resize(tempDt->GetRasterYSize());
131             for (int iPixel = 0; iPixel < tempDt->GetRasterXSize(); iPixel++)
132              {
133                   allSSTPixelNum2[iLine].resize(tempDt->GetRasterXSize());
134                   tempDt->RasterIO(GF_Read, 0, iLine, tempDt->GetRasterXSize(), 1,lineData, tempDt->GetRasterXSize(), 1, GDT_Float32, 1, panBandmap,0,0,0);
135                   allSSTPixelNum2[iLine][iPixel] = lineData[iPixel];
136                 }
137
138            }
139            if(lineData)
140              {
141             delete[]lineData;
142             lineData = NULL;
143               }
144
145            qDebug() << "vwnd read over!" << endl;
146
147            qDebug() <<"vwnd="<<'\n'<<allSSTPixelNum2[200]<<'\n'<<endl;
148
149         }
150
151     //读取wspd数据
152
153     QString qtmpdsc3 = QString::fromStdString(pStrDesc[2]);
154
155     if (qtmpdsc3!=NULL)
156     {
157         GDALDataset  *tempDt = (GDALDataset *)GDALOpen(vFileSets[0].data(), GA_ReadOnly);
158                int BandNum = tempDt->GetRasterCount();
159                qDebug()<<BandNum<<endl;
160                int panBandmap[1] ={1};
161                lineData = new float[1 * 200*200];
162           tempDt->RasterIO(GF_Read,508,112,32,24,lineData,50,50,GDT_Float32,1,panBandmap,0,0,0);
163
164
165            for (int iLine = 0; iLine <tempDt->GetRasterYSize(); iLine++)
166             {
167                  allSSTPixelNum3.resize(tempDt->GetRasterYSize());
168             for (int iPixel = 0; iPixel < tempDt->GetRasterXSize(); iPixel++)
169              {
170                   allSSTPixelNum3[iLine].resize(tempDt->GetRasterXSize());
171                   tempDt->RasterIO(GF_Read, 0, iLine, tempDt->GetRasterXSize(), 1,lineData, tempDt->GetRasterXSize(), 1, GDT_Float32, 1, panBandmap,0,0,0);
172                   allSSTPixelNum3[iLine][iPixel] = lineData[iPixel];
173                 }
174
175            }
176
177            if(lineData)
178              {
179             delete[]lineData;
180             lineData = NULL;
181               }
182
183            qDebug() << "wspd read over!" << endl;
184
185            qDebug() <<"wspd="<<'\n'<<allSSTPixelNum3[200]<<'\n'<<endl;
186
187            GDALClose((GDALDatasetH)tempDt);
188
189         }
190
191         GDALClose((GDALDriverH)fileDataset);
192 }

主函数调用:

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

输出结果:

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

转载于:https://www.cnblogs.com/KunZ586/p/10060424.html

基于GDAL库,读取海洋风场数据(.nc格式)c++版相关推荐

  1. GDAL库读取Envisat ASAR数据

    GDAL库本身就可以读取Envisat的图像数据,具体链接为:http://www.gdal.org/frmt_various.html#Envisat. 但是对于ASAR传感器的数据来说,GDAL在 ...

  2. STC8单片机基于开源库读取mpu6050数据

    STC8单片机基于开源库读取mpu6050数据

  3. Linux配置gdal变量环境,基于GDAL库的LINUX环境下的FY-3D和FY-4A遥感数据处理

    王燕婷 摘要 基于GDAL库的功能和其开源.可对栅格空间数据操作的特点,将GDAL与C++语言的完美结合,可极大得发挥其在开发遥感图像处理软件中的优势,并可跨平台应用于不同操作系统下的遥感图像数据处理 ...

  4. Python爬虫基于Akshare库的内外盘期货数据直接调用

    基于Akshare库的内外盘期货数据 直接调用下面接口函数就行 import akshare as ak # 内盘-历史行情数据(新浪)def inside_history_data(star_, e ...

  5. 从二进制数据流中构造GDAL可以读取的图像数据(C#)

    在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理.原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C# ...

  6. 从二进制数据流中构造GDAL可以读取的图像数据

    在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...

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

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

  8. matlab读取grib三维数据,Grib格式数据处理

    上次我们说到了如何,这次我们说一下如何使用python处理grib格式数据. Grib格式是一种应用于气象领域的简明数据格式,由世界气象组织进行标准化.通常用来存储历史气象数据.当前有3个版本的gri ...

  9. gdal库读取tif影像坐标

    # coding=utf-8 from osgeo import gdal from gdalconst import *def readImage(img_path):data = []# 以只读方 ...

最新文章

  1. 机器学习的数学基础 - 特征分解与奇异值分解
  2. 五款常用邮件管理系统评测
  3. ByWater Solutions支持在图书馆中使用开源
  4. mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
  5. c 调用matlab.m文件,ubuntu系统下C++调用matlab程序的方法详解
  6. 基于环信实现在线聊天功能
  7. 最常被利用的三大 API 漏洞:是什么、为什么、如何阻止?
  8. win10想说爱你不容易——安装.net3.5也是一个坑(已有完美解决方法)
  9. U3D 加在菜单栏加按键 和 动态生成资源束bundles
  10. APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法
  11. Java面试面经大合集(含答案),大厂越来越简单进了,
  12. 解决Fedora14中文显示问题
  13. 使用浏览器检查工具下载网页视频
  14. Mac 阻止搜狗输入法偷偷更新
  15. Java中把word转换成图片
  16. 空间数据库管理方案及数据文件组织方式
  17. VueJs探索之watch用法详解
  18. 【计算机毕业设计】512网上商城购物系统
  19. 计算机硬盘改造u盘,iPhone扩容硬盘不要扔!变废为宝!手把手教你如何改装U盘...
  20. C++数据结构第13课、类族结构的进化

热门文章

  1. CSDN绑定GitHub账号
  2. python输出可执行文件_重定向-禁止在Python调用中输出可执行文件
  3. linux嵌入式贪吃蛇
  4. mysql使用字符函数length,获取参数值的字节个数
  5. 数据库:学好SQL必须知道的10个高级概念
  6. 后端:C#操作Mongodb用法笔记
  7. MySQL数据库常见的几个问题
  8. MYSQL存储引擎笔记
  9. 12c创建为容器数据库_oracle 12c创建可插拔数据库(PDB)与用户详解
  10. js变量提升_学习笔记:JS中的作用域和预解析