本文主要介绍:GDAL常用函数的应用,其中包含图像数据的读取、写入,地理坐标与行列坐标的相互转化,颜色表的读取和设置。
一、图像的读取与写入
//初始化GDAL库注册表
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
//打开图像
CString inPath("C:\\Users\\Administrator\\Desktop\\GF1.tif");
GDALDataset * pInDataset = (GDALDataset * )GDALOpen(inPath,GA_ReadOnly);
if(pInDataset==NULL)
{
AfxMessageBox("读取图像失败!");
return FALSE;
}
int Width = pInDataset->GetRasterXSize(); //获取图像宽
int Height = pInDataset->GetRasterYSize(); //获取图像高
int Count = pInDataset->GetRasterCount(); //波段数
//读取数据
GDALRasterBand *pInRasterBand = pInDataset->GetRasterBand(1);
float *inBuf;
inBuf = new float[Width*Height];
ZeroMemory(inBuf,sizeof(float)*Width*Height);
CPLErr err;
err=pInRasterBand->RasterIO(GF_Read,0,0,Width,Height,inBuf,Width,Height,GDT_Float32,0,0);
if(err==CE_Failure)
{
AfxMessageBox("读取输入图像数据失败!");
return FALSE;
}
//创建输出图像、写图像
CString outPath("C:\\Users\\Administrator\\Desktop\\GF1000.tif");
GDALDriver *poDriver =GetGDALDriverManager()->GetDriverByName("GTiff");
if( poDriver==NULL)
{
AfxMessageBox("获取创建输出图像指针poDriver失败!");
return FALSE;
}
CString OutFilename = CString(outPath);
OutFilename.TrimRight();
GDALDataset* pOutDataset=poDriver->Create(OutFilename,Width,Height,1,GDT_Float32,NULL);
if(pOutDataset == NULL)
{
AfxMessageBox("create输出图像失败!");
return FALSE;
}
GDALRasterBand* pOutRasterBand = pOutDataset->GetRasterBand(1);
err = pOutRasterBand->RasterIO(GF_Write,0,0,Width,Height,inBuf,Width,Height,GDT_Float32,0,0);
if(err==CE_Failure)
{
AfxMessageBox("输出图像写失败!");
return FALSE;
}
//关闭波段和驱动
GDALClose(pInDataset);
GDALClose(pOutDataset);
GetGDALDriverManager()->DeregisterDriver(poDriver);
GDALDestroyDriverManager();
注:
1.在读取图像时,一定要先初始化注册表,不然打开图像会失败。
2.写输出图像结束后,要关闭波段和驱动,不然写的图像会打不开。
二、获取设置仿射信息以及地理坐标与行列坐标的相互转化
//获取地理放射信息
double dGeoTrans[6] = {0};
pInDataset->GetGeoTransform(dGeoTrans);
//设置输出图像仿射信息
pOutDataset->SetGeoTransform(dGeoTrans);
pOutDataset->SetProjection(pInDataset->GetProjectionRef());
//像素行列坐标求地理坐标 row:行数 col:列数
double GeoX = dGeoTrans[0] + col * dGeoTrans[1] + row * dGeoTrans[2]; //地理经度
double GeoY = dGeoTrans[3] + col * dGeoTrans[4] + row * dGeoTrans[5]; //地理纬度
//由地理坐标求行列坐标,相当于已知GeoX,GeoY求row col 解二元方程即可
//这里提供一组解法
double temp = dGeoTrans[1]*dGeoTrans[5] - dGeoTrans[2]*dGeoTrans[4];
col = int(((GeoX-dGeoTrans[0])*dGeoTrans[5] - (GeoY-dGeoTrans[3])*dGeoTrans[2])/temp); //列数
row = int(((GeoY-dGeoTrans[3])*dGeoTrans[1] - (GeoX-dGeoTrans[0])*dGeoTrans[4])/temp); //行数
三、获取颜色表设置颜色表
//获取颜色表,设置颜色表
GDALColorTable * pColorTable;//颜色表
GDALColorEntry * pColorEntry;//颜色组
pColorTable =new GDALColorTable ;//
pColorEntry = new GDALColorEntry[256];
for(int i=0; i<256; i++)
{
pColorEntry[i].c1 = 255; //设置颜色值
pColorEntry[i].c2 = 255;
pColorEntry[i].c3 = 255;
pColorEntry[i].c4 = 0;
pColorTable->SetColorEntry(i,pColorEntry+i);
}
err = pOutRasterBand->SetColorTable(pColorTable); //给输出图像设置颜色表
if(err != CE_None)
{
AfxMessageBox("写颜色表失败!");
return FALSE;
}
delete pColorEntry;
delete pColorTable;
四、统计波段中的最大最小值
<1> virtual double GetMinimum (int *pbSuccess=NULL)
virtual double GetMaximum (int *pbSuccess=NULL)
/*********************************************
功能:统计波段中的最大或最小值
参数说明: pbSuccess:用来指示说明统计结果是否为真实最大最小
如果是,则为1,否则为NULL
返回值: 返回统计得到的最大或最小值
**********************************************/
eg:
int pSuccess;
double minval, maxval;
minval = pBand->GetMinimum(&pSuccess);
maxval = pBand->GetMaximum(&pSuccess);
<2> CPLErr GDALRasterBand::ComputeRasterMinMax(int bApproxOK, double *pdfMinMax)
/*********************************************
功能:统计波段中的最大最小值
参数说明:
bApproxOK: true 表示粗略统计,与真实最大最小有偏差,但统计速度快
false表示严格统计,等于图像真实最值,统计速度相对慢
pdfMinMax: 返回统计的最大最小值
*******************************************/
eg:
double MinMax[2];
pBand->ComputeRasterMinMax(false, MinMax)
<3> virtual CPLErr GetStatistics (int bApproxOK, int bForce, double *pdfMin, double *pdfMax,
double *pdfMean, double *padfStdDev)
/*********************************************
功能:统计波段中的最大最小值,均值、方差等
参数说明:
bApproxOK: true 表示粗略统计,统计速度快
false表示严格统计,统计速度相对慢
bForce: true表示扫描图像进行统计,会生成一个存储最大最大均值方差的xml文件
false表示不扫描图像,而是直接根据生成的xml文件获得这些值,如果没有提前生成xml,
则会出现统计错误。
pdfMin: 返回最小值
pdfMax: 返回最大值
pdfMean: 返回均值
pdfStdDev: 返回方差
*******************************************/
eg:
double minval,maxval,meanval,stddev;
pBand->GetStatistics(FALSE,TRUE,&minval,&maxval,&meanval,&stddev);
<4> virtual CPLErr ComputeStatistics (int bApproxOK, double *pdfMin, double *pdfMax, double *pdfMean,
double *pdfStdDev, GDALProgressFunc, void *pProgressData)
//参数意义与以上相同,后两个参数为进度条参数,可以设为NULL
eg:
double minval,maxval,meanval,stddev;
pBand->ComputeStatistics(FALSE,&minval,&maxval,&meanval,&stddev,NULL,NULL);
五、其它
GDALDataType:
GDT_Byte //Eight bit unsigned integer
GDT_UInt16 //Sixteen bit unsigned integer
GDT_Int16 //Sixteen bit signed integer
GDT_UInt32 //Thirty two bit unsigned integer
GDT_Int32 //Thirty two bit signed integer
GDT_Float32 //Thirty two bit floating point
GDT_Float64 //Sixty four bit floating point
GDT_CInt16 //Complex Int16
GDT_CInt32 //Complex Int32
GDT_CFloat32 //Complex Float32
GDT_CFloat64 //Complex Float64
CString inPath = pInDataset->GetDescription(); //获取输入图像路径
GDALDataType dataType = pInRasterBand->GetRasterDataType(); //获取数据类型
enum CPLErr
{
CE_None = 0; //表示运行成功
CE_Debug = 1;
CE_Warning = 2;
CE_Failure = 3;
CE_Fatal = 4;
}