转自:https://blog.csdn.net/hong__fang/article/details/43529561
本文作用: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;
-
}