vrtdataset.h

00001 /******************************************************************************
00002  * $Id: vrtdataset.h 12156 2007-09-14 14:05:58Z dron $
00003  *
00004  * Project:  Virtual GDAL Datasets
00005  * Purpose:  Declaration of virtual gdal dataset classes.
00006  * Author:   Frank Warmerdam, warmerdam@pobox.com
00007  *
00008  ******************************************************************************
00009  * Copyright (c) 2001, Frank Warmerdam <warmerdam@pobox.com>
00010  *
00011  * Permission is hereby granted, free of charge, to any person obtaining a
00012  * copy of this software and associated documentation files (the "Software"),
00013  * to deal in the Software without restriction, including without limitation
00014  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00015  * and/or sell copies of the Software, and to permit persons to whom the
00016  * Software is furnished to do so, subject to the following conditions:
00017  *
00018  * The above copyright notice and this permission notice shall be included
00019  * in all copies or substantial portions of the Software.
00020  *
00021  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00022  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00023  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
00024  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00025  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00026  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00027  * DEALINGS IN THE SOFTWARE.
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 
00037 int VRTApplyMetadata( CPLXMLNode *, GDALMajorObject * );
00038 CPLXMLNode *VRTSerializeMetadata( GDALMajorObject * );
00039 
00040 /************************************************************************/
00041 /*                              VRTSource                               */
00042 /************************************************************************/
00043 
00044 class VRTSource 
00045 {
00046 public:
00047     virtual ~VRTSource();
00048 
00049     virtual CPLErr  RasterIO( int nXOff, int nYOff, int nXSize, int nYSize, 
00050                               void *pData, int nBufXSize, int nBufYSize, 
00051                               GDALDataType eBufType, 
00052                               int nPixelSpace, int nLineSpace ) = 0;
00053 
00054     virtual CPLErr  XMLInit( CPLXMLNode *psTree, const char * ) = 0;
00055     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath ) = 0;
00056 };
00057 
00058 typedef VRTSource *(*VRTSourceParser)(CPLXMLNode *, const char *);
00059 
00060 VRTSource *VRTParseCoreSources( CPLXMLNode *psTree, const char * );
00061 VRTSource *VRTParseFilterSources( CPLXMLNode *psTree, const char * );
00062 
00063 /************************************************************************/
00064 /*                              VRTDataset                              */
00065 /************************************************************************/
00066 
00067 class CPL_DLL VRTDataset : public GDALDataset
00068 {
00069     char           *pszProjection;
00070 
00071     int            bGeoTransformSet;
00072     double         adfGeoTransform[6];
00073 
00074     int           nGCPCount;
00075     GDAL_GCP      *pasGCPList;
00076     char          *pszGCPProjection;
00077 
00078     int            bNeedsFlush;
00079     int            bWritable;
00080     
00081     char          *pszVRTPath;
00082 
00083   public:
00084                  VRTDataset(int nXSize, int nYSize);
00085                 ~VRTDataset();
00086 
00087     void          SetNeedsFlush() { bNeedsFlush = TRUE; }
00088     virtual void  FlushCache();
00089     
00090     void SetWritable(int bWritable) { this->bWritable = bWritable; }
00091 
00092     virtual const char *GetProjectionRef(void);
00093     virtual CPLErr SetProjection( const char * );
00094     virtual CPLErr GetGeoTransform( double * );
00095     virtual CPLErr SetGeoTransform( double * );
00096 
00097     virtual CPLErr SetMetadata( char **papszMD, const char *pszDomain = "" );
00098     virtual CPLErr SetMetadataItem( const char *pszName, const char *pszValue,
00099                                     const char *pszDomain = "" );
00100 
00101     virtual int    GetGCPCount();
00102     virtual const char *GetGCPProjection();
00103     virtual const GDAL_GCP *GetGCPs();
00104     virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList,
00105                             const char *pszGCPProjection );
00106 
00107     virtual CPLErr AddBand( GDALDataType eType, 
00108                             char **papszOptions=NULL );
00109 
00110     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath);
00111     virtual CPLErr      XMLInit( CPLXMLNode *, const char * );
00112  
00113     static int          Identify( GDALOpenInfo * );
00114     static GDALDataset *Open( GDALOpenInfo * );
00115     static GDALDataset *OpenXML( const char *, const char * = NULL );
00116     static GDALDataset *Create( const char * pszName,
00117                                 int nXSize, int nYSize, int nBands,
00118                                 GDALDataType eType, char ** papszOptions );
00119 };
00120 
00121 /************************************************************************/
00122 /*                           VRTWarpedDataset                           */
00123 /************************************************************************/
00124 
00125 class GDALWarpOperation;
00126 class VRTWarpedRasterBand;
00127 
00128 class CPL_DLL VRTWarpedDataset : public VRTDataset
00129 {
00130     int               nBlockXSize;
00131     int               nBlockYSize;
00132     GDALWarpOperation *poWarper;
00133 
00134 public:
00135     int               nOverviewCount;
00136     VRTWarpedDataset  **papoOverviews;
00137 
00138 public:
00139                       VRTWarpedDataset( int nXSize, int nYSize );
00140                      ~VRTWarpedDataset();
00141 
00142     CPLErr            Initialize( /* GDALWarpOptions */ void * );
00143 
00144     virtual CPLErr IBuildOverviews( const char *, int, int *,
00145                                     int, int *, GDALProgressFunc, void * );
00146     
00147     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00148     virtual CPLErr    XMLInit( CPLXMLNode *, const char * );
00149 
00150     virtual CPLErr AddBand( GDALDataType eType, 
00151                             char **papszOptions=NULL );
00152     
00153     CPLErr            ProcessBlock( int iBlockX, int iBlockY );
00154 
00155     void              GetBlockSize( int *, int * );
00156 };
00157 
00158 /************************************************************************/
00159 /*                            VRTRasterBand                             */
00160 /*                                                                      */
00161 /*      Provides support for all the various kinds of metadata but      */
00162 /*      no raster access.  That is handled by derived classes.          */
00163 /************************************************************************/
00164 
00165 class CPL_DLL VRTRasterBand : public GDALRasterBand
00166 {
00167   protected:
00168     int            bNoDataValueSet;
00169     double         dfNoDataValue;
00170 
00171     GDALColorTable *poColorTable;
00172 
00173     GDALColorInterp eColorInterp;
00174 
00175     char           *pszUnitType;
00176     char           **papszCategoryNames;
00177     
00178     double         dfOffset;
00179     double         dfScale;
00180 
00181     CPLXMLNode    *psSavedHistograms;
00182 
00183     void           Initialize( int nXSize, int nYSize );
00184 
00185   public:
00186 
00187                     VRTRasterBand();
00188     virtual        ~VRTRasterBand();
00189 
00190     virtual CPLErr         XMLInit( CPLXMLNode *, const char * );
00191     virtual CPLXMLNode *   SerializeToXML( const char *pszVRTPath );
00192 
00193     virtual CPLErr SetNoDataValue( double );
00194     virtual double GetNoDataValue( int *pbSuccess = NULL );
00195 
00196     virtual CPLErr SetColorTable( GDALColorTable * ); 
00197     virtual GDALColorTable *GetColorTable();
00198 
00199     virtual CPLErr SetColorInterpretation( GDALColorInterp );
00200     virtual GDALColorInterp GetColorInterpretation();
00201 
00202     virtual const char *GetUnitType();
00203     CPLErr SetUnitType( const char * ); 
00204 
00205     virtual char **GetCategoryNames();
00206     virtual CPLErr SetCategoryNames( char ** );
00207 
00208     virtual CPLErr SetMetadata( char **papszMD, const char *pszDomain = "" );
00209     virtual CPLErr SetMetadataItem( const char *pszName, const char *pszValue,
00210                                     const char *pszDomain = "" );
00211 
00212     virtual double GetOffset( int *pbSuccess = NULL );
00213     CPLErr SetOffset( double );
00214     virtual double GetScale( int *pbSuccess = NULL );
00215     CPLErr SetScale( double );
00216     
00217     virtual CPLErr  GetHistogram( double dfMin, double dfMax,
00218                           int nBuckets, int * panHistogram,
00219                           int bIncludeOutOfRange, int bApproxOK,
00220                           GDALProgressFunc, void *pProgressData );
00221 
00222     virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
00223                                         int *pnBuckets, int ** ppanHistogram,
00224                                         int bForce,
00225                                         GDALProgressFunc, void *pProgressData);
00226 
00227     virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax,
00228                                         int nBuckets, int *panHistogram );
00229 
00230     CPLErr         CopyCommonInfoFrom( GDALRasterBand * );
00231 };
00232 
00233 /************************************************************************/
00234 /*                         VRTSourcedRasterBand                         */
00235 /************************************************************************/
00236 
00237 class CPL_DLL VRTSourcedRasterBand : public VRTRasterBand
00238 {
00239 
00240     void           Initialize( int nXSize, int nYSize );
00241 
00242   public:
00243     int            nSources;
00244     VRTSource    **papoSources;
00245     int            bEqualAreas;
00246 
00247                    VRTSourcedRasterBand( GDALDataset *poDS, int nBand );
00248                    VRTSourcedRasterBand( GDALDataType eType, 
00249                                          int nXSize, int nYSize );
00250                    VRTSourcedRasterBand( GDALDataset *poDS, int nBand, 
00251                                          GDALDataType eType, 
00252                                          int nXSize, int nYSize );
00253     virtual        ~VRTSourcedRasterBand();
00254 
00255     virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00256                               void *, int, int, GDALDataType,
00257                               int, int );
00258 
00259     virtual char      **GetMetadata( const char * pszDomain = "" );
00260     virtual CPLErr      SetMetadata( char ** papszMetadata,
00261                                      const char * pszDomain = "" );
00262     virtual CPLErr      SetMetadataItem( const char * pszName,
00263                                          const char * pszValue,
00264                                          const char * pszDomain = "" );
00265 
00266     virtual CPLErr         XMLInit( CPLXMLNode *, const char * );
00267     virtual CPLXMLNode *   SerializeToXML( const char *pszVRTPath );
00268 
00269     CPLErr         AddSource( VRTSource * );
00270     CPLErr         AddSimpleSource( GDALRasterBand *poSrcBand, 
00271                                     int nSrcXOff=-1, int nSrcYOff=-1, 
00272                                     int nSrcXSize=-1, int nSrcYSize=-1, 
00273                                     int nDstXOff=-1, int nDstYOff=-1, 
00274                                     int nDstXSize=-1, int nDstYSize=-1,
00275                                     const char *pszResampling = "near",
00276                                     double dfNoDataValue = VRT_NODATA_UNSET);
00277     CPLErr         AddComplexSource( GDALRasterBand *poSrcBand, 
00278                                      int nSrcXOff=-1, int nSrcYOff=-1, 
00279                                      int nSrcXSize=-1, int nSrcYSize=-1, 
00280                                      int nDstXOff=-1, int nDstYOff=-1, 
00281                                      int nDstXSize=-1, int nDstYSize=-1,
00282                                      double dfScaleOff=0.0, 
00283                                      double dfScaleRatio=1.0,
00284                                      double dfNoDataValue = VRT_NODATA_UNSET);
00285 
00286     CPLErr         AddFuncSource( VRTImageReadFunc pfnReadFunc, void *hCBData,
00287                                   double dfNoDataValue = VRT_NODATA_UNSET );
00288 
00289 
00290     virtual CPLErr IReadBlock( int, int, void * );
00291 };
00292 
00293 /************************************************************************/
00294 /*                         VRTWarpedRasterBand                          */
00295 /************************************************************************/
00296 
00297 class CPL_DLL VRTWarpedRasterBand : public VRTRasterBand
00298 {
00299   public:
00300                    VRTWarpedRasterBand( GDALDataset *poDS, int nBand,
00301                                      GDALDataType eType = GDT_Unknown );
00302     virtual        ~VRTWarpedRasterBand();
00303 
00304     virtual CPLErr         XMLInit( CPLXMLNode *, const char * );
00305     virtual CPLXMLNode *   SerializeToXML( const char *pszVRTPath );
00306 
00307     virtual CPLErr IReadBlock( int, int, void * );
00308 
00309     virtual int GetOverviewCount();
00310     virtual GDALRasterBand *GetOverview(int);
00311 };
00312 
00313 /************************************************************************/
00314 /*                         VRTDerivedRasterBand                         */
00315 /************************************************************************/
00316 
00317 class CPL_DLL VRTDerivedRasterBand : public VRTSourcedRasterBand
00318 {
00319 
00320  public:
00321     char *pszFuncName;
00322     GDALDataType eSourceTransferType;
00323 
00324     VRTDerivedRasterBand(GDALDataset *poDS, int nBand);
00325     VRTDerivedRasterBand(GDALDataset *poDS, int nBand, 
00326                          GDALDataType eType, int nXSize, int nYSize);
00327     virtual        ~VRTDerivedRasterBand();
00328 
00329     virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00330                               void *, int, int, GDALDataType,
00331                               int, int );
00332 
00333     static CPLErr AddPixelFunction
00334         (const char *pszFuncName, GDALDerivedPixelFunc pfnPixelFunc);
00335     static GDALDerivedPixelFunc GetPixelFunction(const char *pszFuncName);
00336 
00337     void SetPixelFunctionName(const char *pszFuncName);
00338     void SetSourceTransferType(GDALDataType eDataType);
00339 
00340     virtual CPLErr         XMLInit( CPLXMLNode *, const char * );
00341     virtual CPLXMLNode *   SerializeToXML( const char *pszVRTPath );
00342 
00343 };
00344 
00345 /************************************************************************/
00346 /*                           VRTRawRasterBand                           */
00347 /************************************************************************/
00348 
00349 class RawRasterBand;
00350 
00351 class CPL_DLL VRTRawRasterBand : public VRTRasterBand
00352 {
00353     RawRasterBand  *poRawRaster;
00354 
00355     char           *pszSourceFilename;
00356     int            bRelativeToVRT;
00357 
00358   public:
00359                    VRTRawRasterBand( GDALDataset *poDS, int nBand,
00360                                      GDALDataType eType = GDT_Unknown );
00361     virtual        ~VRTRawRasterBand();
00362 
00363     virtual CPLErr         XMLInit( CPLXMLNode *, const char * );
00364     virtual CPLXMLNode *   SerializeToXML( const char *pszVRTPath );
00365 
00366     virtual CPLErr IRasterIO( GDALRWFlag, int, int, int, int,
00367                               void *, int, int, GDALDataType,
00368                               int, int );
00369 
00370     virtual CPLErr IReadBlock( int, int, void * );
00371     virtual CPLErr IWriteBlock( int, int, void * );
00372 
00373     CPLErr         SetRawLink( const char *pszFilename, 
00374                                const char *pszVRTPath,
00375                                int bRelativeToVRT, 
00376                                vsi_l_offset nImageOffset, 
00377                                int nPixelOffset, int nLineOffset, 
00378                                const char *pszByteOrder );
00379 
00380     void           ClearRawLink();
00381 
00382 };
00383 
00384 /************************************************************************/
00385 /*                              VRTDriver                               */
00386 /************************************************************************/
00387 
00388 class VRTDriver : public GDALDriver
00389 {
00390   public:
00391                  VRTDriver();
00392                  ~VRTDriver();
00393 
00394     char         **papszSourceParsers;
00395 
00396     virtual char      **GetMetadata( const char * pszDomain = "" );
00397     virtual CPLErr      SetMetadata( char ** papszMetadata,
00398                                      const char * pszDomain = "" );
00399 
00400     VRTSource   *ParseSource( CPLXMLNode *psSrc, const char *pszVRTPath );
00401     void         AddSourceParser( const char *pszElementName, 
00402                                   VRTSourceParser pfnParser );
00403 };
00404 
00405 /************************************************************************/
00406 /*                           VRTSimpleSource                            */
00407 /************************************************************************/
00408 
00409 class VRTSimpleSource : public VRTSource
00410 {
00411 protected:
00412     GDALRasterBand      *poRasterBand;
00413 
00414     int                 nSrcXOff;
00415     int                 nSrcYOff;
00416     int                 nSrcXSize;
00417     int                 nSrcYSize;
00418 
00419     int                 nDstXOff;
00420     int                 nDstYOff;
00421     int                 nDstXSize;
00422     int                 nDstYSize;
00423 
00424     int                 bNoDataSet;
00425     double              dfNoDataValue;
00426 
00427 public:
00428             VRTSimpleSource();
00429     virtual ~VRTSimpleSource();
00430 
00431     virtual CPLErr  XMLInit( CPLXMLNode *psTree, const char * );
00432     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00433 
00434     void           SetSrcBand( GDALRasterBand * );
00435     void           SetSrcWindow( int, int, int, int );
00436     void           SetDstWindow( int, int, int, int );
00437     void           SetNoDataValue( double dfNoDataValue );
00438 
00439     int            GetSrcDstWindow( int, int, int, int, int, int, 
00440                                     int *, int *, int *, int *,
00441                                     int *, int *, int *, int * );
00442 
00443     virtual CPLErr  RasterIO( int nXOff, int nYOff, int nXSize, int nYSize, 
00444                               void *pData, int nBufXSize, int nBufYSize, 
00445                               GDALDataType eBufType, 
00446                               int nPixelSpace, int nLineSpace );
00447 
00448     void            DstToSrc( double dfX, double dfY,
00449                               double &dfXOut, double &dfYOut );
00450     void            SrcToDst( double dfX, double dfY,
00451                               double &dfXOut, double &dfYOut );
00452 
00453 };
00454 
00455 /************************************************************************/
00456 /*                          VRTAveragedSource                           */
00457 /************************************************************************/
00458 
00459 class VRTAveragedSource : public VRTSimpleSource
00460 {
00461 public:
00462                     VRTAveragedSource();
00463     virtual CPLErr  RasterIO( int nXOff, int nYOff, int nXSize, int nYSize, 
00464                               void *pData, int nBufXSize, int nBufYSize, 
00465                               GDALDataType eBufType, 
00466                               int nPixelSpace, int nLineSpace );
00467     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00468 };
00469 
00470 /************************************************************************/
00471 /*                           VRTComplexSource                           */
00472 /************************************************************************/
00473 
00474 class VRTComplexSource : public VRTSimpleSource
00475 {
00476 public:
00477                    VRTComplexSource();
00478     virtual        ~VRTComplexSource();
00479 
00480     virtual CPLErr RasterIO( int nXOff, int nYOff, int nXSize, int nYSize, 
00481                              void *pData, int nBufXSize, int nBufYSize, 
00482                              GDALDataType eBufType, 
00483                              int nPixelSpace, int nLineSpace );
00484     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00485     virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00486 
00487     int            bDoScaling;
00488     double         dfScaleOff;
00489     double         dfScaleRatio;
00490 
00491 };
00492 
00493 /************************************************************************/
00494 /*                           VRTFilteredSource                          */
00495 /************************************************************************/
00496 
00497 class VRTFilteredSource : public VRTComplexSource
00498 {
00499 private:
00500     int          IsTypeSupported( GDALDataType eType );
00501 
00502 protected:
00503     int          nSupportedTypesCount;
00504     GDALDataType aeSupportedTypes[20];
00505 
00506     int          nExtraEdgePixels;
00507 
00508 public:
00509             VRTFilteredSource();
00510     virtual ~VRTFilteredSource();
00511 
00512     void    SetExtraEdgePixels( int );
00513     void    SetFilteringDataTypesSupported( int, GDALDataType * );
00514 
00515     virtual CPLErr  FilterData( int nXSize, int nYSize, GDALDataType eType, 
00516                                 GByte *pabySrcData, GByte *pabyDstData ) = 0;
00517 
00518     virtual CPLErr  RasterIO( int nXOff, int nYOff, int nXSize, int nYSize, 
00519                               void *pData, int nBufXSize, int nBufYSize, 
00520                               GDALDataType eBufType, 
00521                               int nPixelSpace, int nLineSpace );
00522 };
00523 
00524 /************************************************************************/
00525 /*                       VRTKernelFilteredSource                        */
00526 /************************************************************************/
00527 
00528 class VRTKernelFilteredSource : public VRTFilteredSource
00529 {
00530 protected:
00531     int     nKernelSize;
00532 
00533     double  *padfKernelCoefs;
00534 
00535     int     bNormalized;
00536 
00537 public:
00538             VRTKernelFilteredSource();
00539     virtual ~VRTKernelFilteredSource();
00540 
00541     virtual CPLErr  XMLInit( CPLXMLNode *psTree, const char * );
00542     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00543 
00544     virtual CPLErr  FilterData( int nXSize, int nYSize, GDALDataType eType, 
00545                                 GByte *pabySrcData, GByte *pabyDstData );
00546 
00547     CPLErr          SetKernel( int nKernelSize, double *padfCoefs );
00548     void            SetNormalized( int );
00549 };
00550 
00551 /************************************************************************/
00552 /*                       VRTAverageFilteredSource                       */
00553 /************************************************************************/
00554 
00555 class VRTAverageFilteredSource : public VRTKernelFilteredSource
00556 {
00557 public:
00558             VRTAverageFilteredSource( int nKernelSize );
00559     virtual ~VRTAverageFilteredSource();
00560 
00561     virtual CPLErr  XMLInit( CPLXMLNode *psTree, const char * );
00562     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00563 };
00564 
00565 /************************************************************************/
00566 /*                            VRTFuncSource                             */
00567 /************************************************************************/
00568 class VRTFuncSource : public VRTSource
00569 {
00570 public:
00571             VRTFuncSource();
00572     virtual ~VRTFuncSource();
00573 
00574     virtual CPLErr  XMLInit( CPLXMLNode *, const char *) { return CE_Failure; }
00575     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00576 
00577     virtual CPLErr  RasterIO( int nXOff, int nYOff, int nXSize, int nYSize, 
00578                               void *pData, int nBufXSize, int nBufYSize, 
00579                               GDALDataType eBufType, 
00580                               int nPixelSpace, int nLineSpace );
00581 
00582     VRTImageReadFunc    pfnReadFunc;
00583     void               *pCBData;
00584     GDALDataType        eType;
00585     
00586     float               fNoDataValue;
00587 };
00588 
00589 #endif /* ndef VIRTUALDATASET_H_INCLUDED */

Generated for GDAL by doxygen 1.5.1.