GDAL
gdal_pam.h
00001 /******************************************************************************
00002  * $Id: gdal_pam.h 36501 2016-11-25 14:09:24Z rouault $
00003  *
00004  * Project:  GDAL Core
00005  * Purpose:  Declaration for Peristable Auxiliary Metadata classes.
00006  * Author:   Frank Warmerdam, warmerdam@pobox.com
00007  *
00008  ******************************************************************************
00009  * Copyright (c) 2005, 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 GDAL_PAM_H_INCLUDED
00031 #define GDAL_PAM_H_INCLUDED
00032 
00034 
00035 #include "gdal_priv.h"
00036 
00037 class GDALPamRasterBand;
00038 
00039 /* Clone Info Flags */
00040 
00041 #define GCIF_GEOTRANSFORM       0x01
00042 #define GCIF_PROJECTION         0x02
00043 #define GCIF_METADATA           0x04
00044 #define GCIF_GCPS               0x08
00045 
00046 #define GCIF_NODATA             0x001000
00047 #define GCIF_CATEGORYNAMES      0x002000
00048 #define GCIF_MINMAX             0x004000
00049 #define GCIF_SCALEOFFSET        0x008000
00050 #define GCIF_UNITTYPE           0x010000
00051 #define GCIF_COLORTABLE         0x020000
00052 #define GCIF_COLORINTERP        0x020000
00053 #define GCIF_BAND_METADATA      0x040000
00054 #define GCIF_RAT                0x080000
00055 #define GCIF_MASK               0x100000
00056 #define GCIF_BAND_DESCRIPTION   0x200000
00057 
00058 #define GCIF_ONLY_IF_MISSING    0x10000000
00059 #define GCIF_PROCESS_BANDS      0x20000000
00060 
00061 #define GCIF_PAM_DEFAULT        (GCIF_GEOTRANSFORM | GCIF_PROJECTION |     \
00062                                  GCIF_METADATA | GCIF_GCPS |               \
00063                                  GCIF_NODATA | GCIF_CATEGORYNAMES |        \
00064                                  GCIF_MINMAX | GCIF_SCALEOFFSET |          \
00065                                  GCIF_UNITTYPE | GCIF_COLORTABLE |         \
00066                                  GCIF_COLORINTERP | GCIF_BAND_METADATA |   \
00067                                  GCIF_RAT | GCIF_MASK |                    \
00068                                  GCIF_ONLY_IF_MISSING | GCIF_PROCESS_BANDS|\
00069                                  GCIF_BAND_DESCRIPTION)
00070 
00071 /* GDAL PAM Flags */
00072 /* ERO 2011/04/13 : GPF_AUXMODE seems to be unimplemented */
00073 #define GPF_DIRTY               0x01  // .pam file needs to be written on close
00074 #define GPF_TRIED_READ_FAILED   0x02  // no need to keep trying to read .pam.
00075 #define GPF_DISABLED            0x04  // do not try any PAM stuff.
00076 #define GPF_AUXMODE             0x08  // store info in .aux (HFA) file.
00077 #define GPF_NOSAVE              0x10  // do not try to save pam info.
00078 
00079 /* ==================================================================== */
00080 /*      GDALDatasetPamInfo                                              */
00081 /*                                                                      */
00082 /*      We make these things a separate structure of information        */
00083 /*      primarily so we can modify it without altering the size of      */
00084 /*      the GDALPamDataset.  It is an effort to reduce ABI churn for    */
00085 /*      driver plugins.                                                 */
00086 /* ==================================================================== */
00087 class GDALDatasetPamInfo
00088 {
00089 public:
00090     char        *pszPamFilename;
00091 
00092     char        *pszProjection;
00093 
00094     int         bHaveGeoTransform;
00095     double      adfGeoTransform[6];
00096 
00097     int         nGCPCount;
00098     GDAL_GCP   *pasGCPList;
00099     char       *pszGCPProjection;
00100 
00101     CPLString   osPhysicalFilename;
00102     CPLString   osSubdatasetName;
00103     CPLString   osAuxFilename;
00104 
00105     int         bHasMetadata;
00106 };
00108 
00109 /* ******************************************************************** */
00110 /*                           GDALPamDataset                             */
00111 /* ******************************************************************** */
00112 
00114 class CPL_DLL GDALPamDataset : public GDALDataset
00115 {
00116     friend class GDALPamRasterBand;
00117 
00118   private:
00119     int IsPamFilenameAPotentialSiblingFile();
00120 
00121   protected:
00122 
00123                 GDALPamDataset(void);
00125     int         nPamFlags;
00126     GDALDatasetPamInfo *psPam;
00127 
00128     virtual CPLXMLNode *SerializeToXML( const char *);
00129     virtual CPLErr      XMLInit( CPLXMLNode *, const char * );
00130 
00131     virtual CPLErr TryLoadXML(char **papszSiblingFiles = NULL);
00132     virtual CPLErr TrySaveXML();
00133 
00134     CPLErr  TryLoadAux(char **papszSiblingFiles = NULL);
00135     CPLErr  TrySaveAux();
00136 
00137     virtual const char *BuildPamFilename();
00138 
00139     void   PamInitialize();
00140     void   PamClear();
00141 
00142     void   SetPhysicalFilename( const char * );
00143     const char *GetPhysicalFilename();
00144     void   SetSubdatasetName( const char *);
00145     const char *GetSubdatasetName();
00147 
00148   public:
00149     virtual     ~GDALPamDataset();
00150 
00151     virtual void FlushCache(void) CPL_OVERRIDE;
00152 
00153     virtual const char *GetProjectionRef(void) CPL_OVERRIDE;
00154     virtual CPLErr SetProjection( const char * ) CPL_OVERRIDE;
00155 
00156     virtual CPLErr GetGeoTransform( double * ) CPL_OVERRIDE;
00157     virtual CPLErr SetGeoTransform( double * ) CPL_OVERRIDE;
00158 
00159     virtual int    GetGCPCount() CPL_OVERRIDE;
00160     virtual const char *GetGCPProjection() CPL_OVERRIDE;
00161     virtual const GDAL_GCP *GetGCPs() CPL_OVERRIDE;
00162     virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList,
00163                             const char *pszGCPProjection ) CPL_OVERRIDE;
00164 
00165     virtual CPLErr      SetMetadata( char ** papszMetadata,
00166                                      const char * pszDomain = "" ) CPL_OVERRIDE;
00167     virtual CPLErr      SetMetadataItem( const char * pszName,
00168                                          const char * pszValue,
00169                                          const char * pszDomain = "" ) CPL_OVERRIDE;
00170     virtual char      **GetMetadata( const char * pszDomain = "" ) CPL_OVERRIDE;
00171     virtual const char *GetMetadataItem( const char * pszName,
00172                                          const char * pszDomain = "" ) CPL_OVERRIDE;
00173 
00174     virtual char      **GetFileList(void) CPL_OVERRIDE;
00175 
00177     virtual CPLErr CloneInfo( GDALDataset *poSrcDS, int nCloneInfoFlags );
00178 
00179     virtual CPLErr IBuildOverviews( const char *pszResampling,
00180                                     int nOverviews, int *panOverviewList,
00181                                     int nListBands, int *panBandList,
00182                                     GDALProgressFunc pfnProgress,
00183                                     void * pProgressData ) CPL_OVERRIDE;
00184 
00185     // "semi private" methods.
00186     void   MarkPamDirty() { nPamFlags |= GPF_DIRTY; }
00187     GDALDatasetPamInfo *GetPamInfo() { return psPam; }
00188     int    GetPamFlags() { return nPamFlags; }
00189     void   SetPamFlags(int nValue ) { nPamFlags = nValue; }
00191 
00192   private:
00193     CPL_DISALLOW_COPY_ASSIGN(GDALPamDataset)
00194 };
00195 
00197 /* ==================================================================== */
00198 /*      GDALRasterBandPamInfo                                           */
00199 /*                                                                      */
00200 /*      We make these things a separate structure of information        */
00201 /*      primarily so we can modify it without altering the size of      */
00202 /*      the GDALPamDataset.  It is an effort to reduce ABI churn for    */
00203 /*      driver plugins.                                                 */
00204 /* ==================================================================== */
00205 typedef struct {
00206     GDALPamDataset *poParentDS;
00207 
00208     int            bNoDataValueSet;
00209     double         dfNoDataValue;
00210 
00211     GDALColorTable *poColorTable;
00212 
00213     GDALColorInterp eColorInterp;
00214 
00215     char           *pszUnitType;
00216     char           **papszCategoryNames;
00217 
00218     double         dfOffset;
00219     double         dfScale;
00220 
00221     int            bHaveMinMax;
00222     double         dfMin;
00223     double         dfMax;
00224 
00225     int            bHaveStats;
00226     double         dfMean;
00227     double         dfStdDev;
00228 
00229     CPLXMLNode     *psSavedHistograms;
00230 
00231     GDALRasterAttributeTable *poDefaultRAT;
00232 
00233 } GDALRasterBandPamInfo;
00235 /* ******************************************************************** */
00236 /*                          GDALPamRasterBand                           */
00237 /* ******************************************************************** */
00238 
00240 class CPL_DLL GDALPamRasterBand : public GDALRasterBand
00241 {
00242     friend class GDALPamDataset;
00243 
00244   protected:
00246     virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00247     virtual CPLErr      XMLInit( CPLXMLNode *, const char * );
00248 
00249     void   PamInitialize();
00250     void   PamClear();
00251 
00252     GDALRasterBandPamInfo *psPam;
00254 
00255   public:
00256                 GDALPamRasterBand();
00258     explicit    GDALPamRasterBand(int bForceCachedIO);
00260     virtual     ~GDALPamRasterBand();
00261 
00262     virtual void        SetDescription( const char * ) CPL_OVERRIDE;
00263 
00264     virtual CPLErr SetNoDataValue( double ) CPL_OVERRIDE;
00265     virtual double GetNoDataValue( int *pbSuccess = NULL ) CPL_OVERRIDE;
00266     virtual CPLErr DeleteNoDataValue() CPL_OVERRIDE;
00267 
00268     virtual CPLErr SetColorTable( GDALColorTable * ) CPL_OVERRIDE;
00269     virtual GDALColorTable *GetColorTable() CPL_OVERRIDE;
00270 
00271     virtual CPLErr SetColorInterpretation( GDALColorInterp ) CPL_OVERRIDE;
00272     virtual GDALColorInterp GetColorInterpretation() CPL_OVERRIDE;
00273 
00274     virtual const char *GetUnitType() CPL_OVERRIDE;
00275     CPLErr SetUnitType( const char * ) CPL_OVERRIDE;
00276 
00277     virtual char **GetCategoryNames() CPL_OVERRIDE;
00278     virtual CPLErr SetCategoryNames( char ** ) CPL_OVERRIDE;
00279 
00280     virtual double GetOffset( int *pbSuccess = NULL ) CPL_OVERRIDE;
00281     CPLErr SetOffset( double ) CPL_OVERRIDE;
00282     virtual double GetScale( int *pbSuccess = NULL ) CPL_OVERRIDE;
00283     CPLErr SetScale( double ) CPL_OVERRIDE;
00284 
00285     virtual CPLErr  GetHistogram( double dfMin, double dfMax,
00286                           int nBuckets, GUIntBig * panHistogram,
00287                           int bIncludeOutOfRange, int bApproxOK,
00288                           GDALProgressFunc, void *pProgressData ) CPL_OVERRIDE;
00289 
00290     virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
00291                                         int *pnBuckets, GUIntBig ** ppanHistogram,
00292                                         int bForce,
00293                                         GDALProgressFunc, void *pProgressData) CPL_OVERRIDE;
00294 
00295     virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax,
00296                                         int nBuckets, GUIntBig *panHistogram ) CPL_OVERRIDE;
00297 
00298     virtual CPLErr      SetMetadata( char ** papszMetadata,
00299                                      const char * pszDomain = "" ) CPL_OVERRIDE;
00300     virtual CPLErr      SetMetadataItem( const char * pszName,
00301                                          const char * pszValue,
00302                                          const char * pszDomain = "" ) CPL_OVERRIDE;
00303 
00304     virtual GDALRasterAttributeTable *GetDefaultRAT() CPL_OVERRIDE;
00305     virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * ) CPL_OVERRIDE;
00306 
00308     // new in GDALPamRasterBand.
00309     virtual CPLErr CloneInfo( GDALRasterBand *poSrcBand, int nCloneInfoFlags );
00310 
00311     // "semi private" methods.
00312     GDALRasterBandPamInfo *GetPamInfo() { return psPam; }
00314   private:
00315     CPL_DISALLOW_COPY_ASSIGN(GDALPamRasterBand)
00316 };
00317 
00319 // These are mainly helper functions for internal use.
00320 int CPL_DLL PamParseHistogram( CPLXMLNode *psHistItem,
00321                                double *pdfMin, double *pdfMax,
00322                                int *pnBuckets, GUIntBig **ppanHistogram,
00323                                int *pbIncludeOutOfRange, int *pbApproxOK );
00324 CPLXMLNode CPL_DLL *
00325 PamFindMatchingHistogram( CPLXMLNode *psSavedHistograms,
00326                           double dfMin, double dfMax, int nBuckets,
00327                           int bIncludeOutOfRange, int bApproxOK );
00328 CPLXMLNode CPL_DLL *
00329 PamHistogramToXMLTree( double dfMin, double dfMax,
00330                        int nBuckets, GUIntBig * panHistogram,
00331                        int bIncludeOutOfRange, int bApprox );
00332 
00333 // For managing the proxy file database.
00334 const char CPL_DLL * PamGetProxy( const char * );
00335 const char CPL_DLL * PamAllocateProxy( const char * );
00336 const char CPL_DLL * PamDeallocateProxy( const char * );
00337 void CPL_DLL PamCleanProxyDB( void );
00338 
00340 
00341 #endif /* ndef GDAL_PAM_H_INCLUDED */

Generated for GDAL by doxygen 1.7.6.1.