本文主要介绍: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;
}