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