GDAL学習ノート-グリッドデータセットの読み取りと作成
12642 ワード
グリッドファイルを開く
GDALがサポートするグリッドデータを開く前にドライバを登録する必要があります.GDALAllRegister()関数は、GDALDriverManager::AutoLoadDrivers()関数で自動的にロードされるすべての既知のドライバを登録しようとします.soファイル.
GDALOpen()関数がNULLを返すと、オープンに失敗し、失敗情報はCPLError()関数で取得できます.
データセット情報の取得
adfGeoTransform[]を使用して、いくつかの情報を表すことができます.
次のコードは、データセットの情報を取得します.
グリッド帯域の取得
グリッド帯域の取得はGDALで行うことができ、メタデータ、ブロックサイズ、カラーテーブル、その他の異なる情報も取得できます.
グリッドデータの読み込み
グリッドデータを読み取る方法はいくつかありますが、最も一般的な方法はGDALRasterBand::RasterIO()メソッドで、データ型変換を自動的に行い、上または下にサンプリングします.次のコードは、同じサイズのバッファのデータを読み出す最初の行で、それを浮動小数点型に変換します.
GDALRasterBand::RasterIO()の使用については、このブログを参考にすることができます.
ファイルの作成
GDALでサポートされているファイルフォーマットでは、フォーマットドライバが作成をサポートしている場合は、新しいファイルを作成できます.新しいファイルを作成するには、CreateCopy()とCreate()の2つの方法があります.1つ目の方法はCreateCopy()関数を呼び出し、コピーが必要なソースデータセットパラメータを渡すことです.2つ目の方法はCreate()関数を呼び出すことです.新しいファイルを作成するすべてのドライバはCreateCopyメソッドをサポートし、一部のドライバのみがCreateメソッドをサポートします.駆動がCreateCopyメソッドをサポートするかCreateメソッドをサポートするかを決定するには、フォーマット駆動オブジェクトのDCAP_を確認する必要があります.CREATEとDCAP_CREATECOPYメタデータ.GetDriverByName関数を呼び出す前にGDALAllRegister()でドライバ登録する必要があります.次のコードは、ドライバがサポートする方法をテストします.
CreateCopyメソッドの使用
この方法では、コピーするファイルと保存するファイルを指定する必要があります.
より多くのパラメータを入力し、コピーの進捗状況を表示する必要がある場合は、次のように設計できます.
Createメソッドの使用
既存のファイルを指定した場所にコピーするだけでなく、GDALDriver::Create()メソッドを使用して新しいファイルを作成できます.create()メソッドはパラメータをcreatecopy()と同様に受け入れますが、画像のサイズ、帯域数、帯域タイプを提供する必要があります.
データセットの作成に成功すると、適切なメタデータとグリッドデータ情報はすべて新しいファイルに書き込まなければなりません.
GDALがサポートするグリッドデータを開く前にドライバを登録する必要があります.GDALAllRegister()関数は、GDALDriverManager::AutoLoadDrivers()関数で自動的にロードされるすべての既知のドライバを登録しようとします.soファイル.
GDALAllRegister();
GDALDataset *poDataset;
const char* pszFileName = "C:\\Users\\jinun\\Desktop\\SCRH\\dataset\\sub-TM-Spot-GS.img";
poDataset = (GDALDataset *)GDALOpen( pszFileName, GA_ReadOnly);
if( poDataset == NULL){
printf( "Open the file failed!");
}
else{
printf( "Open succeed!
" );
}
GDALOpen()関数がNULLを返すと、オープンに失敗し、失敗情報はCPLError()関数で取得できます.
データセット情報の取得
adfGeoTransform[]を使用して、いくつかの情報を表すことができます.
adfGeoTransform[0] /* top left x */
adfGeoTransform[1] /* w-e pixel resolution */
adfGeoTransform[2] /* 0 */
adfGeoTransform[3] /* top left y */
adfGeoTransform[4] /* 0 */
adfGeoTransform[5] /* n-s pixel resolution (negative value) */
次のコードは、データセットの情報を取得します.
double adfGeoTransform[6];
printf( "Driver: %s / %s
",
poDataset->GetDriver()->GetDescription(),
poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ));
printf( "Size is %dx%dx%d
",
poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
poDataset->GetRasterCount());
if ( poDataset->GetProjectionRef() != NULL)
{
printf( "Projection is '%s'
",
poDataset->GetProjectionRef() );
}
if (poDataset->GetGeoTransform( adfGeoTransform ) == CE_None){
printf( "Origin = (%.6f,%.6f)
",
adfGeoTransform[0], adfGeoTransform[3] );
printf( "Pixel Size = (%.6f,%.6f)
",
adfGeoTransform[1], adfGeoTransform[5] );
}
グリッド帯域の取得
グリッド帯域の取得はGDALで行うことができ、メタデータ、ブロックサイズ、カラーテーブル、その他の異なる情報も取得できます.
GDALRasterBand *poBand;
int nBlockXSize, nBlockYSize;
int nGotMin, nGotMax;
double adfMinMax[2];
poBand = poDataset->GetRasterBand( 1 );
poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
printf( "Block = %dx%d Type = %s, ColorInterp = %s
",
nBlockXSize, nBlockYSize,
GDALGetDataTypeName( poBand->GetRasterDataType()),
GDALGetColorInterpretationName( poBand->GetColorInterpretation()) );
adfMinMax[0] = poBand->GetMinimum( &nGotMin );
adfMinMax[1] = poBand->GetMaximum( &nGotMax );
if( !( nGotMin && nGotMax )){
GDALComputeRasterMinMax( (GDALRasterBandH)poBand, TRUE, adfMinMax );
}
printf( "Min = %.3fd, Max = %.3f
",adfMinMax[0], adfMinMax[1] );
if( poBand->GetOverviewCount() > 0 ){
printf( "Band has %d overviews.
", poBand->GetOverviewCount() );
}
if( poBand->GetColorTable() != NULL){
printf( "Band has a color table with %d entries.
",
poBand->GetColorTable()->GetColorEntryCount() );
}
グリッドデータの読み込み
グリッドデータを読み取る方法はいくつかありますが、最も一般的な方法はGDALRasterBand::RasterIO()メソッドで、データ型変換を自動的に行い、上または下にサンプリングします.次のコードは、同じサイズのバッファのデータを読み出す最初の行で、それを浮動小数点型に変換します.
float *pafScanline;
int nXSize = poBand->GetXSize();
pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
poBand->RasterIO( GF_Read, 0, 0, nXSize, 1,
pafScanline, nXSize, 1, GDT_Float32,
0, 0 );
GDALRasterBand::RasterIO()の使用については、このブログを参考にすることができます.
ファイルの作成
GDALでサポートされているファイルフォーマットでは、フォーマットドライバが作成をサポートしている場合は、新しいファイルを作成できます.新しいファイルを作成するには、CreateCopy()とCreate()の2つの方法があります.1つ目の方法はCreateCopy()関数を呼び出し、コピーが必要なソースデータセットパラメータを渡すことです.2つ目の方法はCreate()関数を呼び出すことです.新しいファイルを作成するすべてのドライバはCreateCopyメソッドをサポートし、一部のドライバのみがCreateメソッドをサポートします.駆動がCreateCopyメソッドをサポートするかCreateメソッドをサポートするかを決定するには、フォーマット駆動オブジェクトのDCAP_を確認する必要があります.CREATEとDCAP_CREATECOPYメタデータ.GetDriverByName関数を呼び出す前にGDALAllRegister()でドライバ登録する必要があります.次のコードは、ドライバがサポートする方法をテストします.
GDALAllRegister();
/*
* , ADRG、ECRGTOC、GEORASTER、GTiff、HDF4、HDF5、netCDF、
* NITF、NTv2、OGDI、PDF、PostGISRaster、Rasterlite、RPFTOC、RS2、WCS WMS。
*/
const char *pszFormat = "GTiff";
GDALDriver *poDriver;
char **papszMetadata;
poDriver = GetGDALDriverManager()->GetDriverByName( pszFormat );
if (poDriver == NULL){
exit(1);
}
papszMetadata = poDriver->GetMetadata();
if (CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ))
printf( "Driver %s supports Create() method.
", pszFormat );
if ( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE) )
printf( "Driver %s supports CreateCopy() method.
", pszFormat );
CreateCopyメソッドの使用
この方法では、コピーするファイルと保存するファイルを指定する必要があります.
const char* pszSrcFileName = "C:\\Users\\jinun\\SCRH\\dataset\\sub-TM-Spot-GS.img";
const char* pszDstFileName = "C:\\Users\\jinun\\SCRH\\dataset\\dst.img";;
GDALDataset *poSrcDS = (GDALDataset *) GDALOpen( pszSrcFileName, GA_ReadOnly );
GDALDataset *poDstDS;
poDstDS = poDriver->CreateCopy( pszDstFileName, poSrcDS, FALSE,
NULL, NULL, NULL );
if( poDstDS != NULL){
GDALClose( (GDALDatasetH) poDstDS );
}
GDALClose( (GDALDatasetH) poSrcDS );
より多くのパラメータを入力し、コピーの進捗状況を表示する必要がある場合は、次のように設計できます.
char **papszOptions = NULL;
papszOptions = CSLSetNameValue( papszOptions, "TILED", "YES" );
papszOptions = CSLSetNameValue( papszOptions, "COMPRESS" ,"PACKBITS" );
poDstDS = poDriver->CreateCopy( pszDstFileName, poSrcDS, FALSE,
papszOptions, GDALTermProgress, NULL);
if( poDstDS != NULL){
GDALClose( (GDALDatasetH) poDstDS );
}
GDALClose( (GDALDatasetH) poSrcDS );
Createメソッドの使用
既存のファイルを指定した場所にコピーするだけでなく、GDALDriver::Create()メソッドを使用して新しいファイルを作成できます.create()メソッドはパラメータをcreatecopy()と同様に受け入れますが、画像のサイズ、帯域数、帯域タイプを提供する必要があります.
GDALDataset *poDstDS;
char **papszOptions = NULL;
poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte,
papszOptions );
データセットの作成に成功すると、適切なメタデータとグリッドデータ情報はすべて新しいファイルに書き込まなければなりません.
double adfGeoTranform[6] = { 444720, 30, 0, 3751320, 0, -30 };
OGRSpatialReference oSRS;// #include "ogr_spatialref.h"
char *pszSRS_WKT = NULL;
GDALRasterBand *poBand;
GByte abyRaster[512 * 512];
poDstDS->SetGeoTransform( adfGeoTranform );
oSRS.SetUTM( 11, TRUE );
oSRS.SetWellKnownGeogCS( "NAD27" );
oSRS.exportToWkt( &pszSRS_WKT );
CPLFree( pszSRS_WKT );
poBand = poDstDS->GetRasterBand(1);
poBand->RasterIO( GF_Write, 0, 0, 512, 512,
abyRaster, 512, 512, GDT_Byte, 0, 0);
GDALClose( (GDALDatasetH) poDstDS );