GDAL共通関数および例


本稿では、画像データの読み取り、書き込み、地理的座標と行列座標の相互変換、色テーブルの読み取り、設定など、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;
}