📄 grid.h
字号:
virtual CSG_Grid & Add (double Value);
virtual CSG_Grid operator - (const CSG_Grid &Grid) const;
virtual CSG_Grid operator - (double Value) const;
virtual CSG_Grid & operator -= (const CSG_Grid &Grid);
virtual CSG_Grid & operator -= (double Value);
virtual CSG_Grid & Subtract (const CSG_Grid &Grid);
virtual CSG_Grid & Subtract (double Value);
virtual CSG_Grid operator * (const CSG_Grid &Grid) const;
virtual CSG_Grid operator * (double Value) const;
virtual CSG_Grid & operator *= (const CSG_Grid &Grid);
virtual CSG_Grid & operator *= (double Value);
virtual CSG_Grid & Multiply (const CSG_Grid &Grid);
virtual CSG_Grid & Multiply (double Value);
virtual CSG_Grid operator / (const CSG_Grid &Grid) const;
virtual CSG_Grid operator / (double Value) const;
virtual CSG_Grid & operator /= (const CSG_Grid &Grid);
virtual CSG_Grid & operator /= (double Value);
virtual CSG_Grid & Divide (const CSG_Grid &Grid);
virtual CSG_Grid & Divide (double Value);
virtual double operator () (int x, int y) const { return( asDouble(x, y) ); }
//-----------------------------------------------------
// Get Value...
double Get_Value(double xPos, double yPos, int Interpolation = GRID_INTERPOLATION_BSpline, bool bZFactor = false, bool bByteWise = false) const;
double Get_Value(TSG_Point Position , int Interpolation = GRID_INTERPOLATION_BSpline, bool bZFactor = false, bool bByteWise = false) const;
bool Get_Value(double xPos, double yPos, double &Value, int Interpolation = GRID_INTERPOLATION_BSpline, bool bZFactor = false, bool bByteWise = false) const;
bool Get_Value(TSG_Point Position , double &Value, int Interpolation = GRID_INTERPOLATION_BSpline, bool bZFactor = false, bool bByteWise = false) const;
virtual BYTE asByte (int x, int y, bool bZFactor = false) const { return( (BYTE )asDouble(x, y, bZFactor) ); }
virtual BYTE asByte ( long n, bool bZFactor = false) const { return( (BYTE )asDouble( n, bZFactor) ); }
virtual char asChar (int x, int y, bool bZFactor = false) const { return( (char )asDouble(x, y, bZFactor) ); }
virtual char asChar ( long n, bool bZFactor = false) const { return( (char )asDouble( n, bZFactor) ); }
virtual short asShort (int x, int y, bool bZFactor = false) const { return( (short)asDouble(x, y, bZFactor) ); }
virtual short asShort ( long n, bool bZFactor = false) const { return( (short)asDouble( n, bZFactor) ); }
virtual int asInt (int x, int y, bool bZFactor = false) const { return( (int )asDouble(x, y, bZFactor) ); }
virtual int asInt ( long n, bool bZFactor = false) const { return( (int )asDouble( n, bZFactor) ); }
virtual float asFloat (int x, int y, bool bZFactor = false) const { return( (float)asDouble(x, y, bZFactor) ); }
virtual float asFloat ( long n, bool bZFactor = false) const { return( (float)asDouble( n, bZFactor) ); }
//-----------------------------------------------------
virtual double asDouble( long n, bool bZFactor = false) const
{
return( asDouble(n % Get_NX(), n / Get_NX(), bZFactor) );
}
virtual double asDouble(int x, int y, bool bZFactor = false) const
{
double Result;
if( m_Memory_Type == GRID_MEMORY_Normal )
{
switch( m_Type )
{
default: Result = 0.0; break;
case GRID_TYPE_Byte: Result = ((BYTE **)m_Values)[y][x]; break;
case GRID_TYPE_Char: Result = ((char **)m_Values)[y][x]; break;
case GRID_TYPE_Word: Result = ((WORD **)m_Values)[y][x]; break;
case GRID_TYPE_Short: Result = ((short **)m_Values)[y][x]; break;
case GRID_TYPE_DWord: Result = ((DWORD **)m_Values)[y][x]; break;
case GRID_TYPE_Int: Result = ((int **)m_Values)[y][x]; break;
case GRID_TYPE_Float: Result = ((float **)m_Values)[y][x]; break;
case GRID_TYPE_Double: Result = ((double **)m_Values)[y][x]; break;
case GRID_TYPE_Bit: Result =(((BYTE **)m_Values)[y][x / 8] & m_Bitmask[x % 8]) == 0 ? 0.0 : 1.0; break;
}
}
else
{
Result = _LineBuffer_Get_Value(x, y);
}
if( bZFactor )
{
Result *= m_zFactor;
}
return( Result );
}
//-----------------------------------------------------
// Set Value...
virtual void Add_Value(int x, int y, double Value) { Set_Value(x, y, asDouble(x, y) + Value ); }
virtual void Add_Value( long n, double Value) { Set_Value( n, asDouble( n) + Value ); }
virtual void Mul_Value(int x, int y, double Value) { Set_Value(x, y, asDouble(x, y) * Value ); }
virtual void Mul_Value( long n, double Value) { Set_Value( n, asDouble( n) * Value ); }
//-----------------------------------------------------
virtual void Set_Value( long n, double Value)
{
Set_Value(n % Get_NX(), n / Get_NX(), Value);
}
virtual void Set_Value(int x, int y, double Value)
{
if( m_Memory_Type == GRID_MEMORY_Normal )
{
switch( m_Type )
{
default: break;
case GRID_TYPE_Byte: ((BYTE **)m_Values)[y][x] = (BYTE )Value; break;
case GRID_TYPE_Char: ((char **)m_Values)[y][x] = (char )Value; break;
case GRID_TYPE_Word: ((WORD **)m_Values)[y][x] = (WORD )Value; break;
case GRID_TYPE_Short: ((short **)m_Values)[y][x] = (short )Value; break;
case GRID_TYPE_DWord: ((DWORD **)m_Values)[y][x] = (DWORD )Value; break;
case GRID_TYPE_Int: ((int **)m_Values)[y][x] = (int )Value; break;
case GRID_TYPE_Float: ((float **)m_Values)[y][x] = (float )Value; break;
case GRID_TYPE_Double: ((double **)m_Values)[y][x] = (double)Value; break;
case GRID_TYPE_Bit: ((BYTE **)m_Values)[y][x / 8] = Value != 0.0
? ((BYTE **)m_Values)[y][x / 8] | m_Bitmask[x % 8]
: ((BYTE **)m_Values)[y][x / 8] & (~m_Bitmask[x % 8]);
break;
}
}
else
{
_LineBuffer_Set_Value(x, y, Value);
}
Set_Modified();
}
//---------------------------------------------------------
private: ///////////////////////////////////////////////
void **m_Values;
bool m_bCreated, m_bUpdate, m_bSorted, m_Memory_bLock,
Cache_bTemp, Cache_bSwap, Cache_bFlip;
unsigned short **m_Sort_2b; // Index sorted by data values (NX && NY < 2^8)...
int **m_Sort_4b, // Index sorted by data values (NX || NY >= 2^8)...
LineBuffer_Count;
long Cache_Offset;
double m_zMin, m_zMax, m_zFactor,
m_ArithMean, m_Variance,
m_NoData_Value, m_NoData_hiValue;
CSG_File Cache_Stream;
TSG_Grid_Type m_Type;
TSG_Grid_Memory_Type m_Memory_Type;
CSG_Grid_System m_System;
CSG_String m_Description, m_Unit, Cache_Path;
//-----------------------------------------------------
static BYTE m_Bitmask[8];
//-----------------------------------------------------
typedef struct
{
bool bModified;
int y;
char *Data;
}
TSG_Grid_Line;
TSG_Grid_Line *LineBuffer;
//-----------------------------------------------------
void _On_Construction (void);
void _Set_Properties (TSG_Grid_Type m_Type, int NX, int NY, double Cellsize, double xMin, double yMin);
bool _Sort_Execute (void);
bool _Sort_Index (long *Index);
//-----------------------------------------------------
// Memory handling...
int _Get_nLineBytes (void) { return( m_Type == GRID_TYPE_Bit ? Get_NX() / 8 + 1 : Get_NX() * Get_nValueBytes() ); }
bool _Memory_Create (TSG_Grid_Memory_Type aMemory_Type);
void _Memory_Destroy (void);
void _LineBuffer_Create (void);
void _LineBuffer_Destroy (void);
int _LineBuffer_Get_nBytes (void) const { return( gSG_Grid_Type_Sizes[m_Type] * Get_NX() ); }
void _LineBuffer_Flush (void);
TSG_Grid_Line * _LineBuffer_Get_Line (int y) const;
void _LineBuffer_Set_Value (int x, int y, double Value);
double _LineBuffer_Get_Value (int x, int y) const;
bool _Array_Create (void);
void _Array_Destroy (void);
bool _Cache_Create (const SG_Char *FilePath, TSG_Grid_Type File_Type, long Offset, bool bSwap, bool bFlip);
bool _Cache_Create (void);
bool _Cache_Destroy (bool bMemory_Restore);
void _Cache_LineBuffer_Save (TSG_Grid_Line *pLine) const;
void _Cache_LineBuffer_Load (TSG_Grid_Line *pLine, int y) const;
bool _Compr_Create (void);
bool _Compr_Destroy (bool bMemory_Restore);
void _Compr_LineBuffer_Save (TSG_Grid_Line *pLine) const;
void _Compr_LineBuffer_Load (TSG_Grid_Line *pLine, int y) const;
//-----------------------------------------------------
// File access...
void _Swap_Bytes (char *Bytes, int nBytes) const;
bool _Load (const SG_Char *File_Name, TSG_Grid_Type m_Type, TSG_Grid_Memory_Type aMemory_Type);
bool _Load_Binary (CSG_File &Stream, TSG_Grid_Type File_Type, bool bFlip, bool bSwapBytes);
bool _Save_Binary (CSG_File &Stream, int xA, int yA, int xN, int yN, TSG_Grid_Type File_Type, bool bFlip, bool bSwapBytes);
bool _Load_ASCII (CSG_File &Stream, TSG_Grid_Memory_Type aMemory_Type, bool bFlip = false);
bool _Save_ASCII (CSG_File &Stream, int xA, int yA, int xN, int yN, bool bFlip = false);
bool _Load_Native (const SG_Char *File_Header, TSG_Grid_Memory_Type aMemory_Type);
bool _Save_Native (const SG_Char *File_Header, int xA, int yA, int xN, int yN, bool bBinary = true);
int _Load_Native_Get_Key (CSG_File &Stream, CSG_String &Line);
bool _Load_Surfer (const SG_Char *File_Name, TSG_Grid_Memory_Type aMemory_Type);
//-----------------------------------------------------
CSG_Grid & _Operation_Arithmetic (const CSG_Grid &Grid, TSG_Grid_Operation Operation);
CSG_Grid & _Operation_Arithmetic (double Value , TSG_Grid_Operation Operation);
//-----------------------------------------------------
// Interpolation subroutines...
double _Get_ValAtPos_NearestNeighbour (int x, int y, double dx, double dy) const;
double _Get_ValAtPos_BiLinear (int x, int y, double dx, double dy, bool bByteWise) const;
double _Get_ValAtPos_InverseDistance (int x, int y, double dx, double dy, bool bByteWise) const;
double _Get_ValAtPos_BiCubicSpline (int x, int y, double dx, double dy, bool bByteWise) const;
double _Get_ValAtPos_BiCubicSpline (double dx, double dy, double z_xy[4][4]) const;
double _Get_ValAtPos_BSpline (int x, int y, double dx, double dy, bool bByteWise) const;
double _Get_ValAtPos_BSpline (double dx, double dy, double z_xy[4][4]) const;
bool _Get_ValAtPos_Fill4x4Submatrix (int x, int y, double z_xy[4][4]) const;
bool _Get_ValAtPos_Fill4x4Submatrix (int x, int y, double z_xy[4][4][4]) const;
bool _Assign_Interpolated (CSG_Grid *pSource, TSG_Grid_Interpolation Interpolation);
bool _Assign_MeanValue (CSG_Grid *pSource);
};
///////////////////////////////////////////////////////////
// //
// Functions //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
/** Safe grid construction */
SAGA_API_DLL_EXPORT CSG_Grid * SG_Create_Grid (void);
/** Safe grid construction */
SAGA_API_DLL_EXPORT CSG_Grid * SG_Create_Grid (const CSG_Grid &Grid);
/** Safe grid construction */
SAGA_API_DLL_EXPORT CSG_Grid * SG_Create_Grid (const SG_Char *FileName, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
/** Safe grid construction */
SAGA_API_DLL_EXPORT CSG_Grid * SG_Create_Grid (CSG_Grid *pGrid, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
/** Safe grid construction */
SAGA_API_DLL_EXPORT CSG_Grid * SG_Create_Grid (const CSG_Grid_System &System, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
/** Safe grid construction */
SAGA_API_DLL_EXPORT CSG_Grid * SG_Create_Grid (TSG_Grid_Type Type, int NX, int NY, double Cellsize = 0.0, double xMin = 0.0, double yMin = 0.0, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
//---------------------------------------------------------
/** Get default directory for grid caching */
SAGA_API_DLL_EXPORT const SG_Char * SG_Grid_Cache_Get_Directory (void);
/** Set default directory for grid caching */
SAGA_API_DLL_EXPORT void SG_Grid_Cache_Set_Directory (const SG_Char *Directory);
SAGA_API_DLL_EXPORT void SG_Grid_Cache_Set_Automatic (bool bOn);
SAGA_API_DLL_EXPORT bool SG_Grid_Cache_Get_Automatic (void);
SAGA_API_DLL_EXPORT void SG_Grid_Cache_Set_Confirm (int Confirm);
SAGA_API_DLL_EXPORT int SG_Grid_Cache_Get_Confirm (void);
SAGA_API_DLL_EXPORT void SG_Grid_Cache_Set_Threshold (int nBytes);
SAGA_API_DLL_EXPORT void SG_Grid_Cache_Set_Threshold_MB (double nMegabytes);
SAGA_API_DLL_EXPORT int SG_Grid_Cache_Get_Threshold (void);
SAGA_API_DLL_EXPORT double SG_Grid_Cache_Get_Threshold_MB (void);
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#endif // #ifndef HEADER_INCLUDED__SAGA_API__grid_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -