Files
OpenSpace/modules/globebrowsing/ext/gdal/include/gdal_rat.h
T
Alexander Bock 512e35bea6 Feature/globe speedup (#862)
* Updated GDAL version to 2.4.1
 * Add vtune performance commands
 * Add Nvtools performance commands
 * Add warning if GDAL dataset could not be loaded
2019-05-17 18:24:14 +02:00

409 lines
14 KiB
C++

/******************************************************************************
* $Id: gdal_rat.h 2519a7eb0e1649dbf8625ae8ffc7bb7c3ef9514b 2018-07-10 12:05:23 +0100 Robert Coup $
*
* Project: GDAL Core
* Purpose: GDALRasterAttributeTable class declarations.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef GDAL_RAT_H_INCLUDED
#define GDAL_RAT_H_INCLUDED
#include "cpl_minixml.h"
#include "gdal_priv.h"
// Clone and Serialize are allowed to fail if GetRowCount()*GetColCount()
// greater than this number
#define RAT_MAX_ELEM_FOR_CLONE 1000000
/************************************************************************/
/* GDALRasterAttributeTable */
/************************************************************************/
//! Raster Attribute Table interface.
class GDALDefaultRasterAttributeTable;
class CPL_DLL GDALRasterAttributeTable
{
public:
virtual ~GDALRasterAttributeTable();
/**
* \brief Copy Raster Attribute Table
*
* Creates a new copy of an existing raster attribute table. The new copy
* becomes the responsibility of the caller to destroy.
* May fail (return nullptr) if the attribute table is too large to clone
* (GetRowCount() * GetColCount() > RAT_MAX_ELEM_FOR_CLONE)
*
* This method is the same as the C function GDALRATClone().
*
* @return new copy of the RAT as an in-memory implementation.
*/
virtual GDALRasterAttributeTable *Clone() const = 0;
/**
* \brief Fetch table column count.
*
* This method is the same as the C function GDALRATGetColumnCount().
*
* @return the number of columns.
*/
virtual int GetColumnCount() const = 0;
/**
* \brief Fetch name of indicated column.
*
* This method is the same as the C function GDALRATGetNameOfCol().
*
* @param iCol the column index (zero based).
*
* @return the column name or an empty string for invalid column numbers.
*/
virtual const char *GetNameOfCol( int iCol ) const = 0;
/**
* \brief Fetch column usage value.
*
* This method is the same as the C function GDALRATGetUsageOfCol().
*
* @param iCol the column index (zero based).
*
* @return the column usage, or GFU_Generic for improper column numbers.
*/
virtual GDALRATFieldUsage GetUsageOfCol( int iCol ) const = 0;
/**
* \brief Fetch column type.
*
* This method is the same as the C function GDALRATGetTypeOfCol().
*
* @param iCol the column index (zero based).
*
* @return column type or GFT_Integer if the column index is illegal.
*/
virtual GDALRATFieldType GetTypeOfCol( int iCol ) const = 0;
/**
* \brief Fetch column index for given usage.
*
* Returns the index of the first column of the requested usage type, or -1
* if no match is found.
*
* This method is the same as the C function GDALRATGetUsageOfCol().
*
* @param eUsage usage type to search for.
*
* @return column index, or -1 on failure.
*/
virtual int GetColOfUsage( GDALRATFieldUsage eUsage ) const = 0;
/**
* \brief Fetch row count.
*
* This method is the same as the C function GDALRATGetRowCount().
*
* @return the number of rows.
*/
virtual int GetRowCount() const = 0;
/**
* \brief Fetch field value as a string.
*
* The value of the requested column in the requested row is returned
* as a string. If the field is numeric, it is formatted as a string
* using default rules, so some precision may be lost.
*
* The returned string is temporary and cannot be expected to be
* available after the next GDAL call.
*
* This method is the same as the C function GDALRATGetValueAsString().
*
* @param iRow row to fetch (zero based).
* @param iField column to fetch (zero based).
*
* @return field value.
*/
virtual const char *GetValueAsString( int iRow, int iField ) const = 0;
/**
* \brief Fetch field value as a integer.
*
* The value of the requested column in the requested row is returned
* as an integer. Non-integer fields will be converted to integer with
* the possibility of data loss.
*
* This method is the same as the C function GDALRATGetValueAsInt().
*
* @param iRow row to fetch (zero based).
* @param iField column to fetch (zero based).
*
* @return field value
*/
virtual int GetValueAsInt( int iRow, int iField ) const = 0;
/**
* \brief Fetch field value as a double.
*
* The value of the requested column in the requested row is returned
* as a double. Non double fields will be converted to double with
* the possibility of data loss.
*
* This method is the same as the C function GDALRATGetValueAsDouble().
*
* @param iRow row to fetch (zero based).
* @param iField column to fetch (zero based).
*
* @return field value
*/
virtual double GetValueAsDouble( int iRow, int iField ) const = 0;
/**
* \brief Set field value from string.
*
* The indicated field (column) on the indicated row is set from the
* passed value. The value will be automatically converted for other field
* types, with a possible loss of precision.
*
* This method is the same as the C function GDALRATSetValueAsString().
*
* @param iRow row to fetch (zero based).
* @param iField column to fetch (zero based).
* @param pszValue the value to assign.
*/
virtual void SetValue( int iRow, int iField,
const char *pszValue ) = 0;
/**
* \brief Set field value from integer.
*
* The indicated field (column) on the indicated row is set from the
* passed value. The value will be automatically converted for other field
* types, with a possible loss of precision.
*
* This method is the same as the C function GDALRATSetValueAsInteger().
*
* @param iRow row to fetch (zero based).
* @param iField column to fetch (zero based).
* @param nValue the value to assign.
*/
virtual void SetValue( int iRow, int iField, int nValue ) = 0;
/**
* \brief Set field value from double.
*
* The indicated field (column) on the indicated row is set from the
* passed value. The value will be automatically converted for other field
* types, with a possible loss of precision.
*
* This method is the same as the C function GDALRATSetValueAsDouble().
*
* @param iRow row to fetch (zero based).
* @param iField column to fetch (zero based).
* @param dfValue the value to assign.
*/
virtual void SetValue( int iRow, int iField, double dfValue) = 0;
/**
* \brief Determine whether changes made to this RAT are reflected directly
* in the dataset
*
* If this returns FALSE then GDALRasterBand.SetDefaultRAT() should be
* called. Otherwise this is unnecessary since changes to this object are
* reflected in the dataset.
*
* This method is the same as the C function
* GDALRATChangesAreWrittenToFile().
*
*/
virtual int ChangesAreWrittenToFile() = 0;
/**
* \brief Set the RAT table type.
*
* Set whether the RAT is thematic or athematic (continuous).
*
* @since GDAL 2.4
*/
virtual CPLErr SetTableType(const GDALRATTableType eInTableType) = 0;
/**
* \brief Get the RAT table type.
*
* Indicates whether the RAT is thematic or athematic (continuous).
*
* @since GDAL 2.4
* @return table type
*/
virtual GDALRATTableType GetTableType() const = 0;
virtual CPLErr ValuesIO( GDALRWFlag eRWFlag, int iField,
int iStartRow, int iLength,
double *pdfData);
virtual CPLErr ValuesIO( GDALRWFlag eRWFlag, int iField,
int iStartRow, int iLength, int *pnData);
virtual CPLErr ValuesIO( GDALRWFlag eRWFlag, int iField,
int iStartRow, int iLength,
char **papszStrList);
virtual void SetRowCount( int iCount );
virtual int GetRowOfValue( double dfValue ) const;
virtual int GetRowOfValue( int nValue ) const;
virtual CPLErr CreateColumn( const char *pszFieldName,
GDALRATFieldType eFieldType,
GDALRATFieldUsage eFieldUsage );
virtual CPLErr SetLinearBinning( double dfRow0Min,
double dfBinSize );
virtual int GetLinearBinning( double *pdfRow0Min,
double *pdfBinSize ) const;
/**
* \brief Serialize
*
* May fail (return nullptr) if the attribute table is too large to serialize
* (GetRowCount() * GetColCount() > RAT_MAX_ELEM_FOR_CLONE)
*/
virtual CPLXMLNode *Serialize() const;
virtual void *SerializeJSON() const;
virtual CPLErr XMLInit( CPLXMLNode *, const char * );
virtual CPLErr InitializeFromColorTable( const GDALColorTable * );
virtual GDALColorTable *TranslateToColorTable( int nEntryCount = -1 );
virtual void DumpReadable( FILE * = nullptr );
/** Convert a GDALRasterAttributeTable* to a GDALRasterAttributeTableH.
* @since GDAL 2.3
*/
static inline GDALRasterAttributeTableH ToHandle(GDALRasterAttributeTable* poRAT)
{ return static_cast<GDALRasterAttributeTableH>(poRAT); }
/** Convert a GDALRasterAttributeTableH to a GDALRasterAttributeTable*.
* @since GDAL 2.3
*/
static inline GDALRasterAttributeTable* FromHandle(GDALRasterAttributeTableH hRAT)
{ return static_cast<GDALRasterAttributeTable*>(hRAT); }
/**
* \brief Remove statistics from the RAT.
*
* @since GDAL 2.4
*/
virtual void RemoveStatistics() = 0;
};
/************************************************************************/
/* GDALRasterAttributeField */
/* */
/* (private) */
/************************************************************************/
//! @cond Doxygen_Suppress
class GDALRasterAttributeField
{
public:
CPLString sName{};
GDALRATFieldType eType = GFT_Integer;
GDALRATFieldUsage eUsage = GFU_Generic;
std::vector<GInt32> anValues{};
std::vector<double> adfValues{};
std::vector<CPLString> aosValues{};
};
//! @endcond
/************************************************************************/
/* GDALDefaultRasterAttributeTable */
/************************************************************************/
//! Raster Attribute Table container.
class CPL_DLL GDALDefaultRasterAttributeTable : public GDALRasterAttributeTable
{
private:
std::vector<GDALRasterAttributeField> aoFields{};
int bLinearBinning = false; // TODO(schwehr): Can this be a bool?
double dfRow0Min = -0.5;
double dfBinSize = 1.0;
GDALRATTableType eTableType;
void AnalyseColumns();
int bColumnsAnalysed = false; // TODO(schwehr): Can this be a bool?
int nMinCol = -1;
int nMaxCol = -1;
int nRowCount = 0;
CPLString osWorkingResult{};
public:
GDALDefaultRasterAttributeTable();
~GDALDefaultRasterAttributeTable() override;
GDALDefaultRasterAttributeTable *Clone() const override;
int GetColumnCount() const override;
const char *GetNameOfCol( int ) const override;
GDALRATFieldUsage GetUsageOfCol( int ) const override;
GDALRATFieldType GetTypeOfCol( int ) const override;
int GetColOfUsage( GDALRATFieldUsage ) const override;
int GetRowCount() const override;
const char *GetValueAsString( int iRow, int iField ) const override;
int GetValueAsInt( int iRow, int iField ) const override;
double GetValueAsDouble( int iRow, int iField ) const override;
void SetValue( int iRow, int iField,
const char *pszValue ) override;
void SetValue( int iRow, int iField, double dfValue) override;
void SetValue( int iRow, int iField, int nValue ) override;
int ChangesAreWrittenToFile() override;
void SetRowCount( int iCount ) override;
int GetRowOfValue( double dfValue ) const override;
int GetRowOfValue( int nValue ) const override;
CPLErr CreateColumn( const char *pszFieldName,
GDALRATFieldType eFieldType,
GDALRATFieldUsage eFieldUsage ) override;
CPLErr SetLinearBinning( double dfRow0Min,
double dfBinSize ) override;
int GetLinearBinning( double *pdfRow0Min,
double *pdfBinSize ) const override;
CPLErr SetTableType(const GDALRATTableType eInTableType) override;
GDALRATTableType GetTableType() const override;
void RemoveStatistics() override;
};
#endif /* ndef GDAL_RAT_H_INCLUDED */