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 GDAL_PAM_H_INCLUDED
00031 #define GDAL_PAM_H_INCLUDED
00032
00033 #include "gdal_priv.h"
00034
00035 class GDALPamRasterBand;
00036
00037
00038
00039 #define GCIF_GEOTRANSFORM 0x01
00040 #define GCIF_PROJECTION 0x02
00041 #define GCIF_METADATA 0x04
00042 #define GCIF_GCPS 0x08
00043
00044 #define GCIF_NODATA 0x001000
00045 #define GCIF_CATEGORYNAMES 0x002000
00046 #define GCIF_MINMAX 0x004000
00047 #define GCIF_SCALEOFFSET 0x008000
00048 #define GCIF_UNITTYPE 0x010000
00049 #define GCIF_COLORTABLE 0x020000
00050 #define GCIF_COLORINTERP 0x020000
00051 #define GCIF_BAND_METADATA 0x040000
00052 #define GCIF_RAT 0x080000
00053 #define GCIF_MASK 0x100000
00054 #define GCIF_BAND_DESCRIPTION 0x200000
00055
00056 #define GCIF_ONLY_IF_MISSING 0x10000000
00057 #define GCIF_PROCESS_BANDS 0x20000000
00058
00059 #define GCIF_PAM_DEFAULT (GCIF_GEOTRANSFORM | GCIF_PROJECTION | \
00060 GCIF_METADATA | GCIF_GCPS | \
00061 GCIF_NODATA | GCIF_CATEGORYNAMES | \
00062 GCIF_MINMAX | GCIF_SCALEOFFSET | \
00063 GCIF_UNITTYPE | GCIF_COLORTABLE | \
00064 GCIF_COLORINTERP | GCIF_BAND_METADATA | \
00065 GCIF_RAT | GCIF_MASK | \
00066 GCIF_ONLY_IF_MISSING | GCIF_PROCESS_BANDS|\
00067 GCIF_BAND_DESCRIPTION)
00068
00069
00070
00071 #define GPF_DIRTY 0x01 // .pam file needs to be written on close
00072 #define GPF_TRIED_READ_FAILED 0x02 // no need to keep trying to read .pam.
00073 #define GPF_DISABLED 0x04 // do not try any PAM stuff.
00074 #define GPF_AUXMODE 0x08 // store info in .aux (HFA) file.
00075 #define GPF_NOSAVE 0x10 // do not try to save pam info.
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 class GDALDatasetPamInfo
00086 {
00087 public:
00088 char *pszPamFilename;
00089
00090 char *pszProjection;
00091
00092 int bHaveGeoTransform;
00093 double adfGeoTransform[6];
00094
00095 int nGCPCount;
00096 GDAL_GCP *pasGCPList;
00097 char *pszGCPProjection;
00098
00099 CPLString osPhysicalFilename;
00100 CPLString osSubdatasetName;
00101 CPLString osAuxFilename;
00102
00103 int bHasMetadata;
00104 };
00105
00106
00107
00108
00109
00110 class CPL_DLL GDALPamDataset : public GDALDataset
00111 {
00112 friend class GDALPamRasterBand;
00113
00114 private:
00115 int IsPamFilenameAPotentialSiblingFile();
00116
00117 protected:
00118 GDALPamDataset(void);
00119
00120 int nPamFlags;
00121 GDALDatasetPamInfo *psPam;
00122
00123 virtual CPLXMLNode *SerializeToXML( const char *);
00124 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00125
00126 virtual CPLErr TryLoadXML(char **papszSiblingFiles = NULL);
00127 virtual CPLErr TrySaveXML();
00128
00129 CPLErr TryLoadAux(char **papszSiblingFiles = NULL);
00130 CPLErr TrySaveAux();
00131
00132 virtual const char *BuildPamFilename();
00133
00134 void PamInitialize();
00135 void PamClear();
00136
00137 void SetPhysicalFilename( const char * );
00138 const char *GetPhysicalFilename();
00139 void SetSubdatasetName( const char *);
00140 const char *GetSubdatasetName();
00141
00142 public:
00143 virtual ~GDALPamDataset();
00144
00145 virtual void FlushCache(void);
00146
00147 virtual const char *GetProjectionRef(void);
00148 virtual CPLErr SetProjection( const char * );
00149
00150 virtual CPLErr GetGeoTransform( double * );
00151 virtual CPLErr SetGeoTransform( double * );
00152
00153 virtual int GetGCPCount();
00154 virtual const char *GetGCPProjection();
00155 virtual const GDAL_GCP *GetGCPs();
00156 virtual CPLErr SetGCPs( int nGCPCount, const GDAL_GCP *pasGCPList,
00157 const char *pszGCPProjection );
00158
00159 virtual CPLErr SetMetadata( char ** papszMetadata,
00160 const char * pszDomain = "" );
00161 virtual CPLErr SetMetadataItem( const char * pszName,
00162 const char * pszValue,
00163 const char * pszDomain = "" );
00164 virtual char **GetMetadata( const char * pszDomain = "" );
00165 virtual const char *GetMetadataItem( const char * pszName,
00166 const char * pszDomain = "" );
00167
00168 virtual char **GetFileList(void);
00169
00170 virtual CPLErr CloneInfo( GDALDataset *poSrcDS, int nCloneInfoFlags );
00171
00172 virtual CPLErr IBuildOverviews( const char *pszResampling,
00173 int nOverviews, int *panOverviewList,
00174 int nListBands, int *panBandList,
00175 GDALProgressFunc pfnProgress,
00176 void * pProgressData );
00177
00178
00179
00180 void MarkPamDirty() { nPamFlags |= GPF_DIRTY; }
00181 GDALDatasetPamInfo *GetPamInfo() { return psPam; }
00182 int GetPamFlags() { return nPamFlags; }
00183 void SetPamFlags(int nValue ) { nPamFlags = nValue; }
00184 };
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 typedef struct {
00195 GDALPamDataset *poParentDS;
00196
00197 int bNoDataValueSet;
00198 double dfNoDataValue;
00199
00200 GDALColorTable *poColorTable;
00201
00202 GDALColorInterp eColorInterp;
00203
00204 char *pszUnitType;
00205 char **papszCategoryNames;
00206
00207 double dfOffset;
00208 double dfScale;
00209
00210 int bHaveMinMax;
00211 double dfMin;
00212 double dfMax;
00213
00214 int bHaveStats;
00215 double dfMean;
00216 double dfStdDev;
00217
00218 CPLXMLNode *psSavedHistograms;
00219
00220 GDALRasterAttributeTable *poDefaultRAT;
00221
00222 } GDALRasterBandPamInfo;
00223
00224
00225
00226
00227 class CPL_DLL GDALPamRasterBand : public GDALRasterBand
00228 {
00229 friend class GDALPamDataset;
00230
00231 protected:
00232
00233 virtual CPLXMLNode *SerializeToXML( const char *pszVRTPath );
00234 virtual CPLErr XMLInit( CPLXMLNode *, const char * );
00235
00236 void PamInitialize();
00237 void PamClear();
00238
00239 GDALRasterBandPamInfo *psPam;
00240
00241 public:
00242 GDALPamRasterBand();
00243 virtual ~GDALPamRasterBand();
00244
00245 virtual void SetDescription( const char * );
00246
00247 virtual CPLErr SetNoDataValue( double );
00248 virtual double GetNoDataValue( int *pbSuccess = NULL );
00249
00250 virtual CPLErr SetColorTable( GDALColorTable * );
00251 virtual GDALColorTable *GetColorTable();
00252
00253 virtual CPLErr SetColorInterpretation( GDALColorInterp );
00254 virtual GDALColorInterp GetColorInterpretation();
00255
00256 virtual const char *GetUnitType();
00257 CPLErr SetUnitType( const char * );
00258
00259 virtual char **GetCategoryNames();
00260 virtual CPLErr SetCategoryNames( char ** );
00261
00262 virtual double GetOffset( int *pbSuccess = NULL );
00263 CPLErr SetOffset( double );
00264 virtual double GetScale( int *pbSuccess = NULL );
00265 CPLErr SetScale( double );
00266
00267 virtual CPLErr GetHistogram( double dfMin, double dfMax,
00268 int nBuckets, GUIntBig * panHistogram,
00269 int bIncludeOutOfRange, int bApproxOK,
00270 GDALProgressFunc, void *pProgressData );
00271
00272 virtual CPLErr GetDefaultHistogram( double *pdfMin, double *pdfMax,
00273 int *pnBuckets, GUIntBig ** ppanHistogram,
00274 int bForce,
00275 GDALProgressFunc, void *pProgressData);
00276
00277 virtual CPLErr SetDefaultHistogram( double dfMin, double dfMax,
00278 int nBuckets, GUIntBig *panHistogram );
00279
00280 virtual CPLErr SetMetadata( char ** papszMetadata,
00281 const char * pszDomain = "" );
00282 virtual CPLErr SetMetadataItem( const char * pszName,
00283 const char * pszValue,
00284 const char * pszDomain = "" );
00285
00286 virtual GDALRasterAttributeTable *GetDefaultRAT();
00287 virtual CPLErr SetDefaultRAT( const GDALRasterAttributeTable * );
00288
00289
00290 virtual CPLErr CloneInfo( GDALRasterBand *poSrcBand, int nCloneInfoFlags );
00291
00292
00293 GDALRasterBandPamInfo *GetPamInfo() { return psPam; }
00294 };
00295
00296
00297 int CPL_DLL PamParseHistogram( CPLXMLNode *psHistItem,
00298 double *pdfMin, double *pdfMax,
00299 int *pnBuckets, GUIntBig **ppanHistogram,
00300 int *pbIncludeOutOfRange, int *pbApproxOK );
00301 CPLXMLNode CPL_DLL *
00302 PamFindMatchingHistogram( CPLXMLNode *psSavedHistograms,
00303 double dfMin, double dfMax, int nBuckets,
00304 int bIncludeOutOfRange, int bApproxOK );
00305 CPLXMLNode CPL_DLL *
00306 PamHistogramToXMLTree( double dfMin, double dfMax,
00307 int nBuckets, GUIntBig * panHistogram,
00308 int bIncludeOutOfRange, int bApprox );
00309
00310
00311 const char CPL_DLL * PamGetProxy( const char * );
00312 const char CPL_DLL * PamAllocateProxy( const char * );
00313 const char CPL_DLL * PamDeallocateProxy( const char * );
00314 void CPL_DLL PamCleanProxyDB( void );
00315
00316 #endif