GDAL共通関数および例
6051 ワード
本稿では、画像データの読み取り、書き込み、地理的座標と行列座標の相互変換、色テーブルの読み取り、設定など、GDALの一般的な関数の応用について説明します.
一、画像の読み取りと書き込み
注意:
1.画像を読み込むときは、レジストリを初期化する必要があります.そうしないと、画像を開くのに失敗します.
2.書き込み出力画像が終了したら、帯域を閉じて駆動します.そうしないと、書き込み画像が開かなくなります.
二、設定シミュレーション情報及び地理座標と行列座標の相互変換を取得する
三、カラーテーブルの設定カラーテーブルの取得
四、統計帯域における最大最小値
五、その他
一、画像の読み取りと書き込み
// 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;
}