gdal 读取HDF影像并处理

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存储了所有的属性数据。



猜你喜欢

转载自blog.csdn.net/baidu_31933141/article/details/80677457