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 #ifndef VIRTUALDATASET_H_INCLUDED
00031 #define VIRTUALDATASET_H_INCLUDED
00032
00033 #include "gdal_priv.h"
00034 #include "gdal_pam.h"
00035 #include "gdal_vrt.h"
00036 #include "cpl_hash_set.h"
00037
00038 int VRTApplyMetadata( CPLXMLNode *, GDALMajorObject * );
00039 CPLXMLNode *VRTSerializeMetadata( GDALMajorObject * );
00040
00041 int VRTWarpedOverviewTransform( void *pTransformArg, int bDstToSrc,
00042 int nPointCount,
00043 double *padfX, double *padfY, double *padfZ,
00044 int *panSuccess );
00045 void* VRTDeserializeWarpedOverviewTransformer( CPLXMLNode *psTree );
00046
00047
00048
00049
00050 class VRTOverviewInfo
00051 {
00052 public:
00053 CPLString osFilename;
00054 int nBand;
00055 GDALRasterBand *poBand;
00056 int bTriedToOpen;
00057
00058 VRTOverviewInfo() : poBand(NULL), bTriedToOpen(FALSE) {}
00059 ~VRTOverviewInfo() {
00060 if( poBand == NULL )
00061 ;
00062 else if( poBand->GetDataset()->GetShared() )
00063 GDALClose( (GDALDatasetH) poBand->GetDataset() );
00064 else
00065 poBand->GetDataset()->Dereference();
00066 }
00067 };
00068
00069
00070
00071
00072
00073
00074 class VRTSource
00075 {
00076 public:
00077 virtual ~VRTSource();
00078
00079 virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
00080 void *pData, int nBufXSize, int nBufYSize,
00081 GDALDataType eBufType,
00082 int nPixelSpace, int nLineSpace ) = 0;
00083
00084 virtual CPLErr XMLInit( CPLXMLNode *psTree, const char * ) = 0;
00085 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath ) = 0;
00086
00087 virtual void GetFileList(char*** ppapszFileList, int *pnSize,
00088 int *pnMaxSize, CPLHashSet* hSetFiles);
00089 };
00090
00091 typedef VRTSource *(*VRTSourceParser)(CPLXMLNode *, const char *);
00092
00093 VRTSource *VRTParseCoreSources( CPLXMLNode *psTree, const char * );
00094 VRTSource *VRTParseFilterSources( CPLXMLNode *psTree, const char * );
00095
00096
00097
00098
00099
00100 class VRTRasterBand;
00101
00102 class CPL_DLL VRTDataset : public GDALDataset
00103 {
00104 friend class VRTRasterBand;
00105
00106 char *pszProjection;
00107
00108 int bGeoTransformSet;
00109 double adfGeoTransform[6];
00110
00111 int nGCPCount;
00112 GDAL_GCP *pasGCPList;
00113 char *pszGCPProjection;
00114
00115 int bNeedsFlush;
00116 int bWritable;
00117
00118 char *pszVRTPath;
00119
00120 VRTRasterBand *poMaskBand;
00121
00122 public:
00123 VRTDataset(int nXSize, int nYSize);
00124 ~VRTDataset();
00125
00126 void SetNeedsFlush() { bNeedsFlush = TRUE; }
00127 virtual void FlushCache();
00128
00129 void SetWritable(int bWritable) { this->bWritable = bWritable; }
00130
00131 virtual CPLErr CreateMaskBand( int nFlags );
00132 void SetMaskBand(VRTRasterBand* poMaskBand);
00133
00134 virtual const char *GetProjectionRef(void);
00135 virtual CPLErr SetProjection( const char * );
00136 virtual CPLErr GetGeoTransform( double * );
00137 virtual CPLErr SetGeoTransform( double * );
00138
00139 virtual CPLErr SetMetadata( char **papszMD, const char *pszDomain = "" );
00140 virtual CPLErr SetMetadataItem( const char *pszName, const char *pszValue,
00141 const char *pszDomain = "" );
00142
00143 virtual int GetGCPCount();
00144 virtual const char *GetGCPProjection();
00145 virtual const GDAL_GCP *GetGCPs();
00146 virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList,
00147 const char *pszGCPProjection );
00148
00149 virtual CPLErr AddBand( GDALDataType eType,
00150 char **papszOptions=NULL );
00151
00152 virtual char **GetFileList();
00153
00154 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath);
00155 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00156
00157 static int Identify( GDALOpenInfo * );
00158 static GDALDataset *Open( GDALOpenInfo * );
00159 static GDALDataset *OpenXML( const char *, const char * = NULL, GDALAccess eAccess = GA_ReadOnly );
00160 static GDALDataset *Create( const char * pszName,
00161 int nXSize, int nYSize, int nBands,
00162 GDALDataType eType, char ** papszOptions );
00163 static CPLErr Delete( const char * pszFilename );
00164 };
00165
00166
00167
00168
00169
00170 class GDALWarpOperation;
00171 class VRTWarpedRasterBand;
00172
00173 class CPL_DLL VRTWarpedDataset : public VRTDataset
00174 {
00175 int nBlockXSize;
00176 int nBlockYSize;
00177 GDALWarpOperation *poWarper;
00178
00179 friend class VRTWarpedRasterBand;
00180
00181 public:
00182 int nOverviewCount;
00183 VRTWarpedDataset **papoOverviews;
00184
00185 public:
00186 VRTWarpedDataset( int nXSize, int nYSize );
00187 ~VRTWarpedDataset();
00188
00189 CPLErr Initialize( void * );
00190
00191 virtual CPLErr IBuildOverviews( const char *, int, int *,
00192 int, int *, GDALProgressFunc, void * );
00193
00194 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00195 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00196
00197 virtual CPLErr AddBand( GDALDataType eType,
00198 char **papszOptions=NULL );
00199
00200 virtual char **GetFileList();
00201
00202 CPLErr ProcessBlock( int iBlockX, int iBlockY );
00203
00204 void GetBlockSize( int *, int * );
00205 };
00206
00207
00208
00209
00210
00211
00212
00213
00214 class CPL_DLL VRTRasterBand : public GDALRasterBand
00215 {
00216 protected:
00217 int bIsMaskBand;
00218
00219 int bNoDataValueSet;
00220 int bHideNoDataValue;
00221 double dfNoDataValue;
00222
00223 GDALColorTable *poColorTable;
00224
00225 GDALColorInterp eColorInterp;
00226
00227 char *pszUnitType;
00228 char **papszCategoryNames;
00229
00230 double dfOffset;
00231 double dfScale;
00232
00233 CPLXMLNode *psSavedHistograms;
00234
00235 void Initialize( int nXSize, int nYSize );
00236
00237 std::vector<VRTOverviewInfo> apoOverviews;
00238
00239 VRTRasterBand *poMaskBand;
00240
00241 public:
00242
00243 VRTRasterBand();
00244 virtual ~VRTRasterBand();
00245
00246 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00247 virtual CPLXMLNode * SerializeToXML( const char *pszVRTPath );
00248
00249 virtual CPLErr SetNoDataValue( double );
00250 virtual double GetNoDataValue( int *pbSuccess = NULL );
00251
00252 virtual CPLErr SetColorTable( GDALColorTable * );
00253 virtual GDALColorTable *GetColorTable();
00254
00255 virtual CPLErr SetColorInterpretation( GDALColorInterp );
00256 virtual GDALColorInterp GetColorInterpretation();
00257
00258 virtual const char *GetUnitType();
00259 CPLErr SetUnitType( const char * );
00260
00261 virtual char **GetCategoryNames();
00262 virtual CPLErr SetCategoryNames( char ** );
00263
00264 virtual CPLErr SetMetadata( char **papszMD, const char *pszDomain = "" );
00265 virtual CPLErr SetMetadataItem( const char *pszName, const char *pszValue,
00266 const char *pszDomain = "" );
00267
00268 virtual double GetOffset( int *pbSuccess = NULL );
00269 CPLErr SetOffset( double );
00270 virtual double GetScale( int *pbSuccess = NULL );
00271 CPLErr SetScale( double );
00272
00273 virtual int GetOverviewCount();
00274 virtual GDALRasterBand *GetOverview(int);
00275
00276 virtual CPLErr GetHistogram( double dfMin, double dfMax,
00277 int nBuckets, int * panHistogram,
00278 int bIncludeOutOfRange, int bApproxOK,
00279 GDALProgressFunc, void *pProgressData );
00280
00281 virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
00282 int *pnBuckets, int ** ppanHistogram,
00283 int bForce,
00284 GDALProgressFunc, void *pProgressData);
00285
00286 virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax,
00287 int nBuckets, int *panHistogram );
00288
00289 CPLErr CopyCommonInfoFrom( GDALRasterBand * );
00290
00291 virtual void GetFileList(char*** ppapszFileList, int *pnSize,
00292 int *pnMaxSize, CPLHashSet* hSetFiles);
00293
00294 virtual void SetDescription( const char * );
00295
00296 virtual GDALRasterBand *GetMaskBand();
00297 virtual int GetMaskFlags();
00298
00299 virtual CPLErr CreateMaskBand( int nFlags );
00300
00301 void SetMaskBand(VRTRasterBand* poMaskBand);
00302
00303 void SetIsMaskBand();
00304
00305 CPLErr UnsetNoDataValue();
00306 };
00307
00308
00309
00310
00311
00312 class CPL_DLL VRTSourcedRasterBand : public VRTRasterBand
00313 {
00314 private:
00315 int bAlreadyInIRasterIO;
00316 CPLString osLastLocationInfo;
00317
00318 void Initialize( int nXSize, int nYSize );
00319
00320 public:
00321 int nSources;
00322 VRTSource **papoSources;
00323 int bEqualAreas;
00324
00325 VRTSourcedRasterBand( GDALDataset *poDS, int nBand );
00326 VRTSourcedRasterBand( GDALDataType eType,
00327 int nXSize, int nYSize );
00328 VRTSourcedRasterBand( GDALDataset *poDS, int nBand,
00329 GDALDataType eType,
00330 int nXSize, int nYSize );
00331 virtual ~VRTSourcedRasterBand();
00332
00333 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00334 void *, int, int, GDALDataType,
00335 int, int );
00336
00337 virtual const char *GetMetadataItem( const char * pszName,
00338 const char * pszDomain = "" );
00339 virtual char **GetMetadata( const char * pszDomain = "" );
00340 virtual CPLErr SetMetadata( char ** papszMetadata,
00341 const char * pszDomain = "" );
00342 virtual CPLErr SetMetadataItem( const char * pszName,
00343 const char * pszValue,
00344 const char * pszDomain = "" );
00345
00346 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00347 virtual CPLXMLNode * SerializeToXML( const char *pszVRTPath );
00348
00349 CPLErr AddSource( VRTSource * );
00350 CPLErr AddSimpleSource( GDALRasterBand *poSrcBand,
00351 int nSrcXOff=-1, int nSrcYOff=-1,
00352 int nSrcXSize=-1, int nSrcYSize=-1,
00353 int nDstXOff=-1, int nDstYOff=-1,
00354 int nDstXSize=-1, int nDstYSize=-1,
00355 const char *pszResampling = "near",
00356 double dfNoDataValue = VRT_NODATA_UNSET);
00357 CPLErr AddComplexSource( GDALRasterBand *poSrcBand,
00358 int nSrcXOff=-1, int nSrcYOff=-1,
00359 int nSrcXSize=-1, int nSrcYSize=-1,
00360 int nDstXOff=-1, int nDstYOff=-1,
00361 int nDstXSize=-1, int nDstYSize=-1,
00362 double dfScaleOff=0.0,
00363 double dfScaleRatio=1.0,
00364 double dfNoDataValue = VRT_NODATA_UNSET,
00365 int nColorTableComponent = 0);
00366
00367 CPLErr AddMaskBandSource( GDALRasterBand *poSrcBand,
00368 int nSrcXOff=-1, int nSrcYOff=-1,
00369 int nSrcXSize=-1, int nSrcYSize=-1,
00370 int nDstXOff=-1, int nDstYOff=-1,
00371 int nDstXSize=-1, int nDstYSize=-1 );
00372
00373 CPLErr AddFuncSource( VRTImageReadFunc pfnReadFunc, void *hCBData,
00374 double dfNoDataValue = VRT_NODATA_UNSET );
00375
00376
00377 virtual CPLErr IReadBlock( int, int, void * );
00378
00379 virtual void GetFileList(char*** ppapszFileList, int *pnSize,
00380 int *pnMaxSize, CPLHashSet* hSetFiles);
00381 };
00382
00383
00384
00385
00386
00387 class CPL_DLL VRTWarpedRasterBand : public VRTRasterBand
00388 {
00389 public:
00390 VRTWarpedRasterBand( GDALDataset *poDS, int nBand,
00391 GDALDataType eType = GDT_Unknown );
00392 virtual ~VRTWarpedRasterBand();
00393
00394 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00395 virtual CPLXMLNode * SerializeToXML( const char *pszVRTPath );
00396
00397 virtual CPLErr IReadBlock( int, int, void * );
00398 virtual CPLErr IWriteBlock( int, int, void * );
00399
00400 virtual int GetOverviewCount();
00401 virtual GDALRasterBand *GetOverview(int);
00402 };
00403
00404
00405
00406
00407
00408 class CPL_DLL VRTDerivedRasterBand : public VRTSourcedRasterBand
00409 {
00410
00411 public:
00412 char *pszFuncName;
00413 GDALDataType eSourceTransferType;
00414
00415 VRTDerivedRasterBand(GDALDataset *poDS, int nBand);
00416 VRTDerivedRasterBand(GDALDataset *poDS, int nBand,
00417 GDALDataType eType, int nXSize, int nYSize);
00418 virtual ~VRTDerivedRasterBand();
00419
00420 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00421 void *, int, int, GDALDataType,
00422 int, int );
00423
00424 static CPLErr AddPixelFunction
00425 (const char *pszFuncName, GDALDerivedPixelFunc pfnPixelFunc);
00426 static GDALDerivedPixelFunc GetPixelFunction(const char *pszFuncName);
00427
00428 void SetPixelFunctionName(const char *pszFuncName);
00429 void SetSourceTransferType(GDALDataType eDataType);
00430
00431 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00432 virtual CPLXMLNode * SerializeToXML( const char *pszVRTPath );
00433
00434 };
00435
00436
00437
00438
00439
00440 class RawRasterBand;
00441
00442 class CPL_DLL VRTRawRasterBand : public VRTRasterBand
00443 {
00444 RawRasterBand *poRawRaster;
00445
00446 char *pszSourceFilename;
00447 int bRelativeToVRT;
00448
00449 public:
00450 VRTRawRasterBand( GDALDataset *poDS, int nBand,
00451 GDALDataType eType = GDT_Unknown );
00452 virtual ~VRTRawRasterBand();
00453
00454 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00455 virtual CPLXMLNode * SerializeToXML( const char *pszVRTPath );
00456
00457 virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00458 void *, int, int, GDALDataType,
00459 int, int );
00460
00461 virtual CPLErr IReadBlock( int, int, void * );
00462 virtual CPLErr IWriteBlock( int, int, void * );
00463
00464 CPLErr SetRawLink( const char *pszFilename,
00465 const char *pszVRTPath,
00466 int bRelativeToVRT,
00467 vsi_l_offset nImageOffset,
00468 int nPixelOffset, int nLineOffset,
00469 const char *pszByteOrder );
00470
00471 void ClearRawLink();
00472
00473 virtual void GetFileList(char*** ppapszFileList, int *pnSize,
00474 int *pnMaxSize, CPLHashSet* hSetFiles);
00475 };
00476
00477
00478
00479
00480
00481 class VRTDriver : public GDALDriver
00482 {
00483 void *pDeserializerData;
00484
00485 public:
00486 VRTDriver();
00487 ~VRTDriver();
00488
00489 char **papszSourceParsers;
00490
00491 virtual char **GetMetadata( const char * pszDomain = "" );
00492 virtual CPLErr SetMetadata( char ** papszMetadata,
00493 const char * pszDomain = "" );
00494
00495 VRTSource *ParseSource( CPLXMLNode *psSrc, const char *pszVRTPath );
00496 void AddSourceParser( const char *pszElementName,
00497 VRTSourceParser pfnParser );
00498 };
00499
00500
00501
00502
00503
00504 class VRTSimpleSource : public VRTSource
00505 {
00506 protected:
00507 GDALRasterBand *poRasterBand;
00508
00509
00510
00511 GDALRasterBand *poMaskBandMainBand;
00512
00513 int nSrcXOff;
00514 int nSrcYOff;
00515 int nSrcXSize;
00516 int nSrcYSize;
00517
00518 int nDstXOff;
00519 int nDstYOff;
00520 int nDstXSize;
00521 int nDstYSize;
00522
00523 int bNoDataSet;
00524 double dfNoDataValue;
00525
00526 public:
00527 VRTSimpleSource();
00528 virtual ~VRTSimpleSource();
00529
00530 virtual CPLErr XMLInit( CPLXMLNode *psTree, const char * );
00531 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00532
00533 void SetSrcBand( GDALRasterBand * );
00534 void SetSrcMaskBand( GDALRasterBand * );
00535 void SetSrcWindow( int, int, int, int );
00536 void SetDstWindow( int, int, int, int );
00537 void SetNoDataValue( double dfNoDataValue );
00538
00539 int GetSrcDstWindow( int, int, int, int, int, int,
00540 int *, int *, int *, int *,
00541 int *, int *, int *, int * );
00542
00543 virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
00544 void *pData, int nBufXSize, int nBufYSize,
00545 GDALDataType eBufType,
00546 int nPixelSpace, int nLineSpace );
00547
00548 void DstToSrc( double dfX, double dfY,
00549 double &dfXOut, double &dfYOut );
00550 void SrcToDst( double dfX, double dfY,
00551 double &dfXOut, double &dfYOut );
00552
00553 virtual void GetFileList(char*** ppapszFileList, int *pnSize,
00554 int *pnMaxSize, CPLHashSet* hSetFiles);
00555 };
00556
00557
00558
00559
00560
00561 class VRTAveragedSource : public VRTSimpleSource
00562 {
00563 public:
00564 VRTAveragedSource();
00565 virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
00566 void *pData, int nBufXSize, int nBufYSize,
00567 GDALDataType eBufType,
00568 int nPixelSpace, int nLineSpace );
00569 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00570 };
00571
00572
00573
00574
00575
00576 class VRTComplexSource : public VRTSimpleSource
00577 {
00578 public:
00579 VRTComplexSource();
00580 virtual ~VRTComplexSource();
00581
00582 virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
00583 void *pData, int nBufXSize, int nBufYSize,
00584 GDALDataType eBufType,
00585 int nPixelSpace, int nLineSpace );
00586 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00587 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00588 double LookupValue( double dfInput );
00589
00590 int bDoScaling;
00591 double dfScaleOff;
00592 double dfScaleRatio;
00593 double *padfLUTInputs;
00594 double *padfLUTOutputs;
00595 int nLUTItemCount;
00596 int nColorTableComponent;
00597 };
00598
00599
00600
00601
00602
00603 class VRTFilteredSource : public VRTComplexSource
00604 {
00605 private:
00606 int IsTypeSupported( GDALDataType eType );
00607
00608 protected:
00609 int nSupportedTypesCount;
00610 GDALDataType aeSupportedTypes[20];
00611
00612 int nExtraEdgePixels;
00613
00614 public:
00615 VRTFilteredSource();
00616 virtual ~VRTFilteredSource();
00617
00618 void SetExtraEdgePixels( int );
00619 void SetFilteringDataTypesSupported( int, GDALDataType * );
00620
00621 virtual CPLErr FilterData( int nXSize, int nYSize, GDALDataType eType,
00622 GByte *pabySrcData, GByte *pabyDstData ) = 0;
00623
00624 virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
00625 void *pData, int nBufXSize, int nBufYSize,
00626 GDALDataType eBufType,
00627 int nPixelSpace, int nLineSpace );
00628 };
00629
00630
00631
00632
00633
00634 class VRTKernelFilteredSource : public VRTFilteredSource
00635 {
00636 protected:
00637 int nKernelSize;
00638
00639 double *padfKernelCoefs;
00640
00641 int bNormalized;
00642
00643 public:
00644 VRTKernelFilteredSource();
00645 virtual ~VRTKernelFilteredSource();
00646
00647 virtual CPLErr XMLInit( CPLXMLNode *psTree, const char * );
00648 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00649
00650 virtual CPLErr FilterData( int nXSize, int nYSize, GDALDataType eType,
00651 GByte *pabySrcData, GByte *pabyDstData );
00652
00653 CPLErr SetKernel( int nKernelSize, double *padfCoefs );
00654 void SetNormalized( int );
00655 };
00656
00657
00658
00659
00660
00661 class VRTAverageFilteredSource : public VRTKernelFilteredSource
00662 {
00663 public:
00664 VRTAverageFilteredSource( int nKernelSize );
00665 virtual ~VRTAverageFilteredSource();
00666
00667 virtual CPLErr XMLInit( CPLXMLNode *psTree, const char * );
00668 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00669 };
00670
00671
00672
00673
00674 class VRTFuncSource : public VRTSource
00675 {
00676 public:
00677 VRTFuncSource();
00678 virtual ~VRTFuncSource();
00679
00680 virtual CPLErr XMLInit( CPLXMLNode *, const char *) { return CE_Failure; }
00681 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00682
00683 virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize,
00684 void *pData, int nBufXSize, int nBufYSize,
00685 GDALDataType eBufType,
00686 int nPixelSpace, int nLineSpace );
00687
00688 VRTImageReadFunc pfnReadFunc;
00689 void *pCBData;
00690 GDALDataType eType;
00691
00692 float fNoDataValue;
00693 };
00694
00695 #endif