GDAL
gdal_rat.h
1 /******************************************************************************
2  * $Id$
3  *
4  * Project: GDAL Core
5  * Purpose: GDALRasterAttributeTable class declarations.
6  * Author: Frank Warmerdam, warmerdam@pobox.com
7  *
8  ******************************************************************************
9  * Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com>
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a
12  * copy of this software and associated documentation files (the "Software"),
13  * to deal in the Software without restriction, including without limitation
14  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15  * and/or sell copies of the Software, and to permit persons to whom the
16  * Software is furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included
19  * in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27  * DEALINGS IN THE SOFTWARE.
28  ****************************************************************************/
29 
30 #ifndef GDAL_RAT_H_INCLUDED
31 #define GDAL_RAT_H_INCLUDED
32 
33 #include "cpl_minixml.h"
34 #include "gdal_priv.h"
35 
36 // Clone and Serialize are allowed to fail if GetRowCount()*GetColCount()
37 // greater than this number
38 #define RAT_MAX_ELEM_FOR_CLONE 1000000
39 
40 /************************************************************************/
41 /* GDALRasterAttributeTable */
42 /************************************************************************/
43 
46 
48 {
49  public:
50  virtual ~GDALRasterAttributeTable();
63  virtual GDALRasterAttributeTable *Clone() const = 0;
64 
72  virtual int GetColumnCount() const = 0;
73 
83  virtual const char *GetNameOfCol(int iCol) const = 0;
84 
94  virtual GDALRATFieldUsage GetUsageOfCol(int iCol) const = 0;
95 
105  virtual GDALRATFieldType GetTypeOfCol(int iCol) const = 0;
106 
119  virtual int GetColOfUsage(GDALRATFieldUsage eUsage) const = 0;
120 
128  virtual int GetRowCount() const = 0;
129 
147  virtual const char *GetValueAsString(int iRow, int iField) const = 0;
148 
163  virtual int GetValueAsInt(int iRow, int iField) const = 0;
164 
179  virtual double GetValueAsDouble(int iRow, int iField) const = 0;
180 
194  virtual void SetValue(int iRow, int iField, const char *pszValue) = 0;
195 
209  virtual void SetValue(int iRow, int iField, int nValue) = 0;
210 
224  virtual void SetValue(int iRow, int iField, double dfValue) = 0;
225 
238  virtual int ChangesAreWrittenToFile() = 0;
239 
247  virtual CPLErr SetTableType(const GDALRATTableType eInTableType) = 0;
248 
257  virtual GDALRATTableType GetTableType() const = 0;
258 
259  virtual CPLErr ValuesIO(GDALRWFlag eRWFlag, int iField, int iStartRow,
260  int iLength, double *pdfData);
261  virtual CPLErr ValuesIO(GDALRWFlag eRWFlag, int iField, int iStartRow,
262  int iLength, int *pnData);
263  virtual CPLErr ValuesIO(GDALRWFlag eRWFlag, int iField, int iStartRow,
264  int iLength, char **papszStrList);
265 
266  virtual void SetRowCount(int iCount);
267  virtual int GetRowOfValue(double dfValue) const;
268  virtual int GetRowOfValue(int nValue) const;
269 
270  virtual CPLErr CreateColumn(const char *pszFieldName,
271  GDALRATFieldType eFieldType,
272  GDALRATFieldUsage eFieldUsage);
273  virtual CPLErr SetLinearBinning(double dfRow0Min, double dfBinSize);
274  virtual int GetLinearBinning(double *pdfRow0Min, double *pdfBinSize) const;
275 
282  virtual CPLXMLNode *Serialize() const;
283  virtual void *SerializeJSON() const;
284  virtual CPLErr XMLInit(const CPLXMLNode *, const char *);
285 
286  virtual CPLErr InitializeFromColorTable(const GDALColorTable *);
287  virtual GDALColorTable *TranslateToColorTable(int nEntryCount = -1);
288 
289  virtual void DumpReadable(FILE * = nullptr);
290 
294  static inline GDALRasterAttributeTableH
296  {
297  return static_cast<GDALRasterAttributeTableH>(poRAT);
298  }
299 
303  static inline GDALRasterAttributeTable *
305  {
306  return static_cast<GDALRasterAttributeTable *>(hRAT);
307  }
308 
314  virtual void RemoveStatistics() = 0;
315 };
316 
317 /************************************************************************/
318 /* GDALRasterAttributeField */
319 /* */
320 /* (private) */
321 /************************************************************************/
323 class GDALRasterAttributeField
324 {
325  public:
326  CPLString sName{};
327 
329 
331 
332  std::vector<GInt32> anValues{};
333  std::vector<double> adfValues{};
334  std::vector<CPLString> aosValues{};
335 };
336 
338 
339 /************************************************************************/
340 /* GDALDefaultRasterAttributeTable */
341 /************************************************************************/
342 
344 
346 {
347  private:
348  std::vector<GDALRasterAttributeField> aoFields{};
349 
350  int bLinearBinning = false; // TODO(schwehr): Can this be a bool?
351  double dfRow0Min = -0.5;
352  double dfBinSize = 1.0;
353 
354  GDALRATTableType eTableType;
355 
356  void AnalyseColumns();
357  int bColumnsAnalysed = false; // TODO(schwehr): Can this be a bool?
358  int nMinCol = -1;
359  int nMaxCol = -1;
360 
361  int nRowCount = 0;
362 
363  CPLString osWorkingResult{};
364 
365  public:
368 
369  GDALDefaultRasterAttributeTable *Clone() const override;
370 
371  int GetColumnCount() const override;
372 
373  const char *GetNameOfCol(int) const override;
374  GDALRATFieldUsage GetUsageOfCol(int) const override;
375  GDALRATFieldType GetTypeOfCol(int) const override;
376 
377  int GetColOfUsage(GDALRATFieldUsage) const override;
378 
379  int GetRowCount() const override;
380 
381  const char *GetValueAsString(int iRow, int iField) const override;
382  int GetValueAsInt(int iRow, int iField) const override;
383  double GetValueAsDouble(int iRow, int iField) const override;
384 
385  void SetValue(int iRow, int iField, const char *pszValue) override;
386  void SetValue(int iRow, int iField, double dfValue) override;
387  void SetValue(int iRow, int iField, int nValue) override;
388 
389  int ChangesAreWrittenToFile() override;
390  void SetRowCount(int iCount) override;
391 
392  int GetRowOfValue(double dfValue) const override;
393  int GetRowOfValue(int nValue) const override;
394 
395  CPLErr CreateColumn(const char *pszFieldName, GDALRATFieldType eFieldType,
396  GDALRATFieldUsage eFieldUsage) override;
397  CPLErr SetLinearBinning(double dfRow0Min, double dfBinSize) override;
398  int GetLinearBinning(double *pdfRow0Min, double *pdfBinSize) const override;
399 
400  CPLErr SetTableType(const GDALRATTableType eInTableType) override;
401  GDALRATTableType GetTableType() const override;
402 
403  void RemoveStatistics() override;
404 };
405 
406 #endif /* ndef GDAL_RAT_H_INCLUDED */
Convenient string class based on std::string.
Definition: cpl_string.h:320
A color table / palette.
Definition: gdal_priv.h:1348
Raster Attribute Table container.
Definition: gdal_rat.h:346
The GDALRasterAttributeTable (or RAT) class is used to encapsulate a table used to provide attribute ...
Definition: gdal_rat.h:48
virtual void SetValue(int iRow, int iField, const char *pszValue)=0
Set field value from string.
virtual double GetValueAsDouble(int iRow, int iField) const =0
Fetch field value as a double.
static GDALRasterAttributeTableH ToHandle(GDALRasterAttributeTable *poRAT)
Convert a GDALRasterAttributeTable* to a GDALRasterAttributeTableH.
Definition: gdal_rat.h:295
virtual void RemoveStatistics()=0
Remove statistics from the RAT.
virtual int GetRowCount() const =0
Fetch row count.
virtual int ChangesAreWrittenToFile()=0
Determine whether changes made to this RAT are reflected directly in the dataset.
static GDALRasterAttributeTable * FromHandle(GDALRasterAttributeTableH hRAT)
Convert a GDALRasterAttributeTableH to a GDALRasterAttributeTable*.
Definition: gdal_rat.h:304
virtual CPLErr SetTableType(const GDALRATTableType eInTableType)=0
Set the RAT table type.
virtual int GetColumnCount() const =0
Fetch table column count.
virtual GDALRATFieldUsage GetUsageOfCol(int iCol) const =0
Fetch column usage value.
virtual const char * GetValueAsString(int iRow, int iField) const =0
Fetch field value as a string.
virtual void SetValue(int iRow, int iField, int nValue)=0
Set field value from integer.
virtual GDALRATTableType GetTableType() const =0
Get the RAT table type.
virtual void SetValue(int iRow, int iField, double dfValue)=0
Set field value from double.
virtual int GetValueAsInt(int iRow, int iField) const =0
Fetch field value as a integer.
virtual const char * GetNameOfCol(int iCol) const =0
Fetch name of indicated column.
virtual int GetColOfUsage(GDALRATFieldUsage eUsage) const =0
Fetch column index for given usage.
virtual GDALRATFieldType GetTypeOfCol(int iCol) const =0
Fetch column type.
virtual GDALRasterAttributeTable * Clone() const =0
Copy Raster Attribute Table.
CPLErr
Error category.
Definition: cpl_error.h:53
Definitions for CPL mini XML Parser/Serializer.
GDALRATTableType
RAT table type (thematic or athematic)
Definition: gdal.h:2028
GDALRATFieldUsage
Field usage of raster attribute table.
Definition: gdal.h:2002
@ GFU_Generic
Definition: gdal.h:2003
GDALRATFieldType
Field type of raster attribute table.
Definition: gdal.h:1994
@ GFT_Integer
Definition: gdal.h:1995
void * GDALRasterAttributeTableH
Opaque type used for the C bindings of the C++ GDALRasterAttributeTable class.
Definition: gdal.h:304
GDALRWFlag
Definition: gdal.h:132
C++ GDAL entry points.
Document node structure.
Definition: cpl_minixml.h:71