基于GDAL库,读取海洋风场数据(.nc格式)c++版
经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形、海洋表面温度、盐度、湿度、云场、风场等数据,除了地形数据是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++版相关推荐
- GDAL库读取Envisat ASAR数据
GDAL库本身就可以读取Envisat的图像数据,具体链接为:http://www.gdal.org/frmt_various.html#Envisat. 但是对于ASAR传感器的数据来说,GDAL在 ...
- STC8单片机基于开源库读取mpu6050数据
STC8单片机基于开源库读取mpu6050数据
- Linux配置gdal变量环境,基于GDAL库的LINUX环境下的FY-3D和FY-4A遥感数据处理
王燕婷 摘要 基于GDAL库的功能和其开源.可对栅格空间数据操作的特点,将GDAL与C++语言的完美结合,可极大得发挥其在开发遥感图像处理软件中的优势,并可跨平台应用于不同操作系统下的遥感图像数据处理 ...
- Python爬虫基于Akshare库的内外盘期货数据直接调用
基于Akshare库的内外盘期货数据 直接调用下面接口函数就行 import akshare as ak # 内盘-历史行情数据(新浪)def inside_history_data(star_, e ...
- 从二进制数据流中构造GDAL可以读取的图像数据(C#)
在上一篇博客中,讲了一下使用GDAL从文件流中构造一个GDAL可以识别的数据来进行处理.原以为这个接口在C#中没有,仔细看了下GDAL库中源码,发现C#版本也有类似的函数,下面是GDAL库中的一个C# ...
- 从二进制数据流中构造GDAL可以读取的图像数据
在很多时候,我们的图像数据往往都不是文件方式存储在磁盘上,而是可能从网络或者数据库中获取的是二进制的图像数据流.最简单的方式和最容易想到的方式就是将这个文件流保存到磁盘上形成一个文件,然后再使用GDA ...
- GDAL库——读取图像并提取基本信息
GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL ...
- matlab读取grib三维数据,Grib格式数据处理
上次我们说到了如何,这次我们说一下如何使用python处理grib格式数据. Grib格式是一种应用于气象领域的简明数据格式,由世界气象组织进行标准化.通常用来存储历史气象数据.当前有3个版本的gri ...
- gdal库读取tif影像坐标
# coding=utf-8 from osgeo import gdal from gdalconst import *def readImage(img_path):data = []# 以只读方 ...
最新文章
- 机器学习的数学基础 - 特征分解与奇异值分解
- 五款常用邮件管理系统评测
- ByWater Solutions支持在图书馆中使用开源
- mysql 多进程配置_基于mysql_multi实现MySQL多实例多进程配置
- c 调用matlab.m文件,ubuntu系统下C++调用matlab程序的方法详解
- 基于环信实现在线聊天功能
- 最常被利用的三大 API 漏洞:是什么、为什么、如何阻止?
- win10想说爱你不容易——安装.net3.5也是一个坑(已有完美解决方法)
- U3D 加在菜单栏加按键 和 动态生成资源束bundles
- APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法
- Java面试面经大合集(含答案),大厂越来越简单进了,
- 解决Fedora14中文显示问题
- 使用浏览器检查工具下载网页视频
- Mac 阻止搜狗输入法偷偷更新
- Java中把word转换成图片
- 空间数据库管理方案及数据文件组织方式
- VueJs探索之watch用法详解
- 【计算机毕业设计】512网上商城购物系统
- 计算机硬盘改造u盘,iPhone扩容硬盘不要扔!变废为宝!手把手教你如何改装U盘...
- C++数据结构第13课、类族结构的进化