文档库 最新最全的文档下载
当前位置:文档库 › GDAL读取HDF和GRB2

GDAL读取HDF和GRB2

gdal 读取hdf格式
int ConvertHdf2NomTif(const char * pszSrcFile,const char * outFpath,const char* paraname,int *withheight)
{
/*int x = 0, y = 0;*/
GDALDataset *pDataSet = (GDALDataset *) GDALOpen( pszSrcFile, GA_ReadOnly );
if (pDataSet == NULL)
{
printf("不能打开该文件,请检查文件是否存在!");
return 0;
}

char ** papszSUBDATASETS = GDALGetMetadata( GDALOpen( pszSrcFile, GA_ReadOnly ), "SUBDATASETS");


vector vSubDataSets;
vector vSubDataDesc;
if ( papszSUBDATASETS == NULL )
{
string papszMetadata = GDALGetDriverShortName((GDALDriverH)pDataSet);
vSubDataSets.push_back(papszMetadata);
vSubDataDesc.push_back(papszMetadata);
}
//这里定义了两个vector,分别用来存储子数据集的路径和描述信息。
else
{
int iCount = CSLCount(papszSUBDATASETS);
//使用CSLCount函数获取这个字符串数组的个数,如果不大于0就说明没有,直接关闭HDF数据返回。
if(iCount < 0)
{
GDALClose((GDALDriverH)pDataSet);
return 0;
}

for(int i=0; papszSUBDATASETS[i] != NULL; i++ )
{
if(i%2 != 0)
continue;

/*判断子数据集的位置*/
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);

GDALDatasetH hTmpDt = GDALOpen(tmpc_str, GA_ReadOnly);
string papszMetadata = GDALGetDriverShortName((GDALDriverH)pDataSet);
if(hTmpDt != NULL)
{
vSubDataSets.push_back(tmpstr);
vSubDataDesc.push_back(tmpdsc/*papszMetadata*/);

GDALClose(hTmpDt);
}
}

}
//判断读取HDF中数据集中的需要的要素,生成原始的圆盘数据等//
string paranamestr = paraname;
for (int i = 0;i< vSubDataSets.size();i++)
{

string SubDataSets = vSubDataSets[i];
transform(SubDataSets.begin(),SubDataSets.end(),SubDataSets.begin(), ::toupper);
transform(paranamestr.begin(),paranamestr.end(),paranamestr.begin(), ::toupper);
const char * SubDataSets1 = SubDataSets.c_str();
const char * paranamestr1 = paranamestr.c_str();

int r = FindClass(SubDataSets1,paranamestr1);
if ( r != -1)
{
const char * ELENMENT = vSubDataSets[i].c_str();
GDALDataset * DataSet = (GDALDataset *)GDALOpen(ELENMENT, GA_ReadOnly);
int X =DataSet->GetRasterXSize();
int Y = DataSet->GetRasterYSize();
withheight[0] = X;
withheight[1] = Y;
GDALRasterBand *Band = DataSet->GetRasterBand(1);//获得数据内容
GDALDataType TYPE =Band->GetRasterDataType();
switch (TYPE)
{
case (GDT_Byte):
{unsigned char* bandvalue = new unsigned char[X * Y];
Band -> RasterIO( GF_Read, 0,0,X,Y,bandvalue,X,Y,Band->GetRasterDataType(),0,0);

GDALDriver * podrive;
podrive = GetGDALDriverMa

nager() -> GetDriverByName("GTIFF");

GDALDataset * OPTemp;
OPTemp = podrive ->Create(outFpath,X,Y,1,Band->GetRasterDataType(),NULL);
GDALRasterBand * TPband ;
TPband = OPTemp ->GetRasterBand(1);
TPband -> RasterIO( GF_Write, 0,0,X,Y,bandvalue,X,Y,Band->GetRasterDataType(),0,0);
GDALClose(OPTemp);

delete []bandvalue;
bandvalue = NULL;
GDALClose(OPTemp);
break;
}
case (GDT_UInt16):
{unsigned short* bandvalue = new unsigned short[X * Y];
Band -> RasterIO( GF_Read, 0,0,X,Y,bandvalue,X,Y,Band->GetRasterDataType(),0,0);

GDALDriver * podrive;
podrive = GetGDALDriverManager() -> GetDriverByName("GTIFF");

GDALDataset * OPTemp;
OPTemp = podrive ->Create(outFpath,X,Y,1,Band->GetRasterDataType(),NULL);
GDALRasterBand * TPband ;
TPband = OPTemp ->GetRasterBand(1);
TPband -> RasterIO( GF_Write, 0,0,X,Y,bandvalue,X,Y,Band->GetRasterDataType(),0,0);

GDALClose(OPTemp);

delete []bandvalue;
bandvalue = NULL;

break;
}
default:
{break;}

}

GDALClose((GDALDriver * )DataSet);
break;
}

}
GDALClose((GDALDriverH)pDataSet);
return 0;
}





gdal 读取grb2格式
const int blockSize = 200;

template
void BlockImgConvertProcess( int lblockXSize,int lblockYSize, int blockSize,int bandIndex,
int j,int k,GDALRasterBand* poBand,GDALRasterBand* poBand_img)
{
T *ppdata = new T[lblockXSize * lblockYSize];

poBand->RasterIO( GF_Read, j * blockSize, k * blockSize, lblockXSize, lblockYSize,
ppdata, lblockXSize, lblockYSize, poBand->GetRasterDataType(),
0, 0 );

poBand_img -> RasterIO ( GF_Write, j * blockSize, k * blockSize, lblockXSize, lblockYSize,
ppdata,lblockXSize, lblockYSize, poBand_img->GetRasterDataType(), 0, 0);

delete[] ppdata;
ppdata = NULL;
}
bool GRBToImg(const char* pchTifPath, const char* pchImgPath)
{

string strTifPath = pchTifPath;
string strTifExt = strTifPath.substr(strTifPath.rfind('.') + 1, strTifPath.length());
string strImgPath = pchImgPath;
string strImgExt = strImgPath.substr(strImgPath.rfind('.') + 1, strImgPath.length());

transform(strTifExt.begin(),strTifExt.end(),strTifExt.begin(), ::toupper);
transform(strImgExt.begin(),strImgExt.end(),strImgExt.begin(), ::toupper);

if(strTifExt != "GRB2" || strImgExt != "TIF")
return false;

GDALDataset *poDataset;

//打开图像
poDataset = (GDALDataset *)GDALOpen( pchTifPath, GA_ReadOnly );
if( poDataset == NULL )
{
return false;
}
//打开图像

//获取图像信息
double adfGeoTransform[6];
double *maomao = new double[6];

long lWidth = poDataset->GetRasterXSize();
long lHeight = poDataset->GetRasterYSize();
long lBandCount = poDataset->GetRasterCount();
const char* chWkt = poDataset->GetProjectionRef();

poDataset->GetGeoTransform( adfGeoTransform );
//获取图像信息

vector bandscrip;

vector name;
const char * scrip;
//char ** NAME2= poDataset->GetRasterBand(1)->GetCategoryNames();
string papszMetadata = GDALGetDriverShortName((GDALDriverH)poDataset);


GDALDataType SrcDataType = poDataset->GetRasterBand(1)->GetRasterDataType();

for(int i =1;i<= lBandCount;i++)
{
scrip= poDataset->GetRasterBand(i)->GetDescription();
char ** bandname = poDataset->GetRasterBand(i)->GetMetadata();
string bandnamestr1 = bandname[0];
string bandnamestr2 = bandname[1];
name.push_back(bandnamestr1);
bandscrip.push_back(scrip);
}
//创建一个新的空的图像//
GDALDataset *poDstDS;
const char *pszFormat = "GTIFF";
char **papszOptions = NULL;
GDALDriver *poDriver;
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);

poDstDS = poDriver->Create( pchImgPath, lWidth, lHeight, 1, SrcDataType,
papszOptions );
poDstDS ->SetProjection(chWkt);
poDstDS ->SetGeoTransform( &adfGeoTransform[0]);//加个取址符可以变成指针,数组在内存中的首地址//
//写入第一个波段//

int xblocknum, yblocknum;
if (lWidth % blockSize != 0)
xblocknum = lWidth / blockSize + 1;
else
xblocknum = lWidth / blockSize;

if (lHeight % blockSize != 0)
yblocknum = lHeight / blockSize + 1;
else
yblocknum = lHeight / blockSize;

for ( int i = 0; i < 1; ++i)
{
GDALRasterBand *poBand;
poBand = poDataset->GetRasterBand(i+1);

GDALRasterBand *poBand_img;
poBand_img = poDstDS->GetRasterBand(i + 1);

for(int j = 0; j != xblocknum; ++j)
{
int lblockXSize;
if(j == xblocknum - 1)
lblockXSize = lWidth - blockSize * j;
else
lblockXSize = blockSize;

for(int k = 0; k != yblocknum; ++k)
{
int lblockYSize;
if(k == yblocknum - 1)
lblockYSize = lHeight - blockSize * k;
else
lblockYSize = blockSize;

switch(SrcDataType)
{
case GDT_Byte:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, poBand_img);
}
break;
case GDT_UInt16:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, poBand_img);
}
break;
case GDT_Int16:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, poBand_img);
}
break;
case GDT_UInt32:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, poBand_img);
}
break;
case GDT_Int32:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, poBand_img);
}
break;
case GDT_Float32:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, poBand_img);
}
break;
case GDT_Float64:
{
BlockImgConvertProcess(lblockXSize, lblockYSize,blockSize, i, j, k, poBand, p

oBand_img);
}
break;
default:
{
return false;
}
break;
}

}
}
}
GDALClose(poDataset);
GDALClose(poDstDS);

return true;
}

相关文档