00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 00030 00030 00030 00030 00031 00032 00033 00034 00035 00036 00037 00038 00039 00040 00041 00042 00043 00044 00045 00046 00047 00048 00049 00050 00051 00052 00053 00054 00055 00056 00057 00058 00059 00060 00061 00062 00063 00064 00065 00066 00067 00068 00069 00070 00071 00072 00073 00074 00075 00076 00077 00078 00079
00080
00081 #include "gdal_priv.h"
00082
00083
00084
00085
00086
00087 GDALDriver::GDALDriver()
00088
00089 {
00090 pszShortName = NULL;
00091 pszLongName = NULL;
00092 pszHelpTopic = NULL;
00093
00094 pfnOpen = NULL;
00095 pfnCreate = NULL;
00096 pfnDelete = NULL;
00097 pfnCreateCopy = NULL;
00098 }
00099
00100
00101
00102
00103
00104 GDALDriver::~GDALDriver()
00105
00106 {
00107 }
00108
00109
00110
00111
00112
00131 GDALDataset * GDALDriver::Create( const char * pszFilename,
00132 int nXSize, int nYSize, int nBands,
00133 GDALDataType eType, char ** papszParmList )
00134
00135 {
00136
00137
00138 if( pfnCreate == NULL )
00139 {
00140 CPLError( CE_Failure, CPLE_NotSupported,
00141 "GDALDriver::Create() ... no create method implemented"
00142 " for this format.\n" );
00143
00144 return NULL;
00145 }
00146 else
00147 {
00148 GDALDataset *poDS;
00149
00150 poDS = pfnCreate( pszFilename, nXSize, nYSize, nBands, eType,
00151 papszParmList );
00152
00153 if( poDS != NULL )
00154 poDS->SetDescription( pszFilename );
00155
00156 return poDS;
00157 }
00158 }
00159
00160
00161
00162
00163
00164 GDALDatasetH CPL_DLL GDALCreate( GDALDriverH hDriver,
00165 const char * pszFilename,
00166 int nXSize, int nYSize, int nBands,
00167 GDALDataType eBandType,
00168 char ** papszOptions )
00169
00170 {
00171 return( ((GDALDriver *) hDriver)->Create( pszFilename,
00172 nXSize, nYSize, nBands,
00173 eBandType, papszOptions ) );
00174 }
00175
00176
00177
00178
00179
00213 GDALDataset *GDALDriver::CreateCopy( const char * pszFilename,
00214 GDALDataset * poSrcDS,
00215 int bStrict, char ** papszOptions,
00216 GDALProgressFunc pfnProgress,
00217 void * pProgressData )
00218
00219 {
00220 if( pfnProgress == NULL )
00221 pfnProgress = GDALDummyProgress;
00222
00223
00224
00225
00226
00227
00228 if( pfnCreateCopy != NULL )
00229 {
00230 GDALDataset *poDstDS;
00231
00232 poDstDS = pfnCreateCopy( pszFilename, poSrcDS, bStrict, papszOptions,
00233 pfnProgress, pProgressData );
00234 if( poDstDS != NULL )
00235 {
00236 if( poDstDS->GetDescription() == NULL
00237 || strlen(poDstDS->GetDescription()) > 0 )
00238 poDstDS->SetDescription( pszFilename );
00239 }
00240
00241 return poDstDS;
00242 }
00243
00244
00245
00246
00247 GDALDataset *poDstDS;
00248 int nXSize = poSrcDS->GetRasterXSize();
00249 int nYSize = poSrcDS->GetRasterYSize();
00250 GDALDataType eType = poSrcDS->GetRasterBand(1)->GetRasterDataType();
00251 CPLErr eErr;
00252
00253 CPLDebug( "GDAL", "Using default GDALDriver::CreateCopy implementation." );
00254
00255 if( !pfnProgress( 0.0, NULL, pProgressData ) )
00256 {
00257 CPLError( CE_Failure, CPLE_UserInterrupt, "User terminated" );
00258 return NULL;
00259 }
00260
00261 poDstDS = Create( pszFilename, nXSize, nYSize,
00262 poSrcDS->GetRasterCount(), eType, papszOptions );
00263
00264 if( poDstDS == NULL )
00265 return NULL;
00266
00267
00268
00269
00270
00271
00272 double adfGeoTransform[6];
00273
00274 if( poSrcDS->GetGeoTransform( adfGeoTransform ) == CE_None )
00275 {
00276 poDstDS->SetGeoTransform( adfGeoTransform );
00277 }
00278
00279 if( poSrcDS->GetProjectionRef() != NULL
00280 && strlen(poSrcDS->GetProjectionRef()) > 0 )
00281 {
00282 poDstDS->SetProjection( poSrcDS->GetProjectionRef() );
00283 }
00284
00285
00286
00287
00288 for( int iBand = 0; iBand < poSrcDS->GetRasterCount(); iBand++ )
00289 {
00290 GDALRasterBand *poSrcBand = poSrcDS->GetRasterBand( iBand+1 );
00291 GDALRasterBand *poDstBand = poDstDS->GetRasterBand( iBand+1 );
00292
00293 void *pData;
00294
00295 pData = CPLMalloc(nXSize * 8);
00296
00297 for( int iLine = 0; iLine < nYSize; iLine++ )
00298 {
00299 eErr = poSrcBand->RasterIO( GF_Read, 0, iLine, nXSize, 1,
00300 pData, nXSize, 1, eType, 0, 0 );
00301 if( eErr != CE_None )
00302 {
00303 return NULL;
00304 }
00305
00306 eErr = poDstBand->RasterIO( GF_Write, 0, iLine, nXSize, 1,
00307 pData, nXSize, 1, eType, 0, 0 );
00308
00309 if( eErr != CE_None )
00310 {
00311 return NULL;
00312 }
00313
00314 if( !pfnProgress( (iBand + iLine / (double) nYSize)
00315 / (double) poSrcDS->GetRasterCount(),
00316 NULL, pProgressData ) )
00317 {
00318 CPLError( CE_Failure, CPLE_UserInterrupt, "User terminated" );
00319 delete poDstDS;
00320 Delete( pszFilename );
00321 return NULL;
00322 }
00323 }
00324
00325 CPLFree( pData );
00326 }
00327
00328 return poDstDS;
00329 }
00330
00331
00332
00333
00334
00335 GDALDatasetH GDALCreateCopy( GDALDriverH hDriver,
00336 const char * pszFilename,
00337 GDALDatasetH hSrcDS,
00338 int bStrict, char ** papszOptions,
00339 GDALProgressFunc pfnProgress,
00340 void * pProgressData )
00341
00342 {
00343 return (GDALDatasetH) ((GDALDriver *) hDriver)->
00344 CreateCopy( pszFilename, (GDALDataset *) hSrcDS, bStrict, papszOptions,
00345 pfnProgress, pProgressData );
00346 }
00347
00348
00349
00350
00351
00371 CPLErr GDALDriver::Delete( const char * pszFilename )
00372
00373 {
00374 if( pfnDelete != NULL )
00375 return pfnDelete( pszFilename );
00376 else
00377 {
00378 VSIStatBuf sStat;
00379
00380 if( VSIStat( pszFilename, &sStat ) == 0 && VSI_ISREG( sStat.st_mode ) )
00381 {
00382 if( VSIUnlink( pszFilename ) == 0 )
00383 return CE_None;
00384 else
00385 {
00386 CPLError( CE_Failure, CPLE_AppDefined,
00387 "%s: Attempt to unlink %s failed.\n",
00388 pszShortName, pszFilename );
00389 return CE_Failure;
00390 }
00391 }
00392 else
00393 {
00394 CPLError( CE_Failure, CPLE_AppDefined,
00395 "%s: Unable to delete %s, not a file.\n",
00396 pszShortName, pszFilename );
00397 return CE_Failure;
00398 }
00399 }
00400 }
00401
00402
00403
00404
00405
00406 CPLErr GDALDeleteDataset( GDALDriverH hDriver, const char * pszFilename )
00407
00408 {
00409 return ((GDALDriver *) hDriver)->Delete( pszFilename );
00410 }
00411
00412
00413
00414
00415
00416 const char * GDALGetDriverShortName( GDALDriverH hDriver )
00417
00418 {
00419 if( hDriver == NULL )
00420 return NULL;
00421 else
00422 return ((GDALDriver *) hDriver)->pszShortName;
00423 }
00424
00425
00426
00427
00428
00429 const char * GDALGetDriverLongName( GDALDriverH hDriver )
00430
00431 {
00432 if( hDriver == NULL )
00433 return NULL;
00434 else
00435 return ((GDALDriver *) hDriver)->pszLongName;
00436 }
00437
00438
00439
00440
00441
00442 const char * GDALGetDriverHelpTopic( GDALDriverH hDriver )
00443
00444 {
00445 if( hDriver == NULL )
00446 return NULL;
00447 else
00448 return ((GDALDriver *) hDriver)->pszHelpTopic;
00449 }
00450