gdal本身不自带HDF处理的功能,要自己手动配置gdal处理HDF。
本文主要是做HDF属性的读取,以及HDF二级文件的读取。
属性为satellite到LongitudeStep的全部,涉及HDF各种数据属性,SSWS和SSWD为两个转悠数据集。
目的是读取属性值,和打开SSWS与SSWD的数据集。
1.读取HDF二级文件,并将所有像素值存储到数组中。
vector<vector<float>> allSSWSPixelNum; GDALAllRegister(); GDALDataset *pDataSet = (GDALDataset *)GDALOpen(pszSrcFile.toStdString().c_str(), GA_ReadOnly); if (pDataSet == NULL) { printf("不能打开该文件,请检查文件是否存在!"); } char ** papszSUBDATASETS = GDALGetMetadata(pDataSet, "SUBDATASETS"); vector<string> vSubDataSets; vector<string> vSubDataDesc; if (papszSUBDATASETS == NULL) { string papszMetadata = GDALGetDriverShortName((GDALDriverH)pDataSet); vSubDataSets.push_back(papszMetadata); vSubDataDesc.push_back(papszMetadata); } else { int iCount = CSLCount(papszSUBDATASETS); if (iCount < 0) { GDALClose((GDALDriverH)pDataSet); return false; } for (int i = 0; papszSUBDATASETS[i] != NULL; i += 2) { string tmpstr = string(papszSUBDATASETS[i]); tmpstr = tmpstr.substr(tmpstr.find_first_of("=") + 1); const char *tmpc_str = tmpstr.c_str(); string tmpdsc = string(papszSUBDATASETS[i + 1]); tmpdsc = tmpdsc.substr(tmpdsc.find_first_of("=") + 1); QString qtmpdsc = QString::fromStdString(tmpdsc); QStringList qtmpdsclist = qtmpdsc.split(" "); QString dataset_name = qtmpdsclist[1]; if (dataset_name == "SSWS") { GDALDataset *hTmpDt = (GDALDataset *)GDALOpen(tmpc_str, GA_ReadOnly); float *lineData = NULL; GDALRasterBand * poBand = hTmpDt->GetRasterBand(1); lineData = new float[1 * poBand->GetXSize()]; for (int iLine = 0; iLine < poBand->GetYSize(); iLine++) { allSSWSPixelNum.resize(poBand->GetYSize()); for (int iPixel = 0; iPixel < poBand->GetXSize(); iPixel++) { allSSWSPixelNum[iLine].resize(poBand->GetXSize()); poBand->RasterIO(GF_Read, 0, iLine, poBand->GetXSize(), 1, lineData, poBand->GetXSize(), 1, GDT_Float32, 0, 0); allSSWSPixelNum[iLine][iPixel] = lineData[iPixel]; } } if (lineData) { delete[]lineData; lineData = NULL; } GDALClose((GDALDatasetH)hTmpDt); } } } GDALClose((GDALDatasetH)pDataSet); _allSSWSPixelNum = allSSWSPixelNum; allSSWSPixelNum.clear(); return true; }
注意:
char ** papszSUBDATASETS = GDALGetMetadata(pDataSet, "SUBDATASETS")可以获取二级文件。
这样,将SSWS所有数据存储到了allSSWSPixelNum中。
同理,SSWD数据也可以这样操作。
2.读取HDF属性数据
bool ConvertHdf2NomTif(const char * pszSrcFile, const char * outFpath) { GDALAllRegister(); GDALDataset *pDataSet = (GDALDataset *)GDALOpen(pszSrcFile, GA_ReadOnly); if (pDataSet == NULL) { printf("不能打开该文件,请检查文件是否存在!"); return 0; } char** papszMetadata = GDALGetMetadata(pDataSet, NULL); }papszMetadata存储了所有的属性数据。