GDAL读取HDF,NETCDF等subdatasets数据(多个数据集数据)
由于modis卫星数据(HDF数据)跟我们经常遇到的geotif数据组织方式不一样,读取的时候一定要特别注意。geotif数据,一般是一个文件,包含了多个波段的数据;而modis呢,一个文件包含了多各SUBdatasets 。GDAL,每个subdataset又包含多个波段数据。另外默认编译的GDAL并不包含对MODIS数据支持,需要单独下载针对HDF4,HDF5的源码,再修改下make.opt文件,这时再编译GDAL,就支持modis数据的读写了。如果嫌麻烦就下载一个别人编译好了的来用,网上有很多基于GDAL的开源项目,搜一下就可以了。
下面给一个例子,关键GDAL读取hdf数据、netcdf数据集、NTIF数据等多个数据集的数据格式;
////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <vector>
#include<string>
using namespace std;
#include<math.h>
#include gdal.h”
#include gdal_priv.h”
#include ogr_srs_api.h”
#include cpl_string.h”
#include cpl_conv.h”
#pragma comment (lib,”..//lib//gdal_i.lib”)
int main(int argc, char *argv[])
{
GDALAllRegister();
vector<GDALDataset *> datasets;
char * hdfFileName=”D://fsbdata//V2KRNS10__20060411_NDVI__SE-Asia//0001//0001_NDV.HDF”;
GDALDataset *tmpDataset = (GDALDataset *) GDALOpen( hdfFileName, GA_ReadOnly);
if(tmpDataset==NULL) return 0;
GDALDriver * driver=tmpDataset->GetDriver ();
string papszMetadata=GDALGetDriverShortName((GDALDriverH)tmpDataset);
int index=papszMetadata.find_first_of(“hdf”);
if(index<0)
index=papszMetadata.find_first_of(“HDF”);
if(index)
{
char ** SUBDATASETS = GDALGetMetadata( (GDALDatasetH)tmpDataset, “SUBDATASETS” );
if( CSLCount(SUBDATASETS) > 0 )
{
printf( “Subdatasets:/n” );
for(int i = 0; SUBDATASETS[i] != NULL; i++ )
{
if(i%2==0)
{
string tmpstr=string(SUBDATASETS[i]);
tmpstr=tmpstr.substr(tmpstr.find_first_of(“=”)+1);
const char *tmpfilename=tmpstr.c_str();
GDALDataset * tmpdt=(GDALDataset *) GDALOpen(tmpfilename, GA_ReadOnly);
if(tmpdt)
{
datasets.push_back(tmpdt);
}
}
}
}
else
{
int bandCount=tmpDataset->GetRasterCount();
if(bandCount>0)
{
GDALRasterBand * poband=tmpDataset->GetRasterBand(1);
}
printf( “it contains %d bands! /n”,bandCount);
}
}
if(!datasets.empty())
{
int count=datasets.size();
int bandCount=0;
for(int i=0;i<count;i++)
{
bandCount+=datasets[i]->GetRasterCount();
if(datasets[i]->GetRasterCount()>0)
{
GDALRasterBand * poband=datasets[i]->GetRasterBand(1);
}
}
printf( “it contains %d bands! /n”,bandCount);
for(i=0;i<count;i++)
{
delete datasets[i];
datasets[i]=NULL;
}
datasets.reserve(0);
}
delete tmpDataset;
delete driver;
printf( “it’s ok! please enter any key! /n” );
return 0;
}
转载自:https://blog.csdn.net/zhoubl668/article/details/6603276