📄 grid.h
字号:
return( ptWorld );
}
//-----------------------------------------------------
double Get_xGrid_to_World (int xGrid) const { return( Get_XMin() + xGrid * m_Cellsize ); }
double Get_yGrid_to_World (int yGrid) const { return( Get_YMin() + yGrid * m_Cellsize ); }
TSG_Point Get_Grid_to_World (int xGrid, int yGrid) const
{
TSG_Point pt;
pt.x = Get_xGrid_to_World(xGrid);
pt.y = Get_yGrid_to_World(yGrid);
return( pt );
}
//-----------------------------------------------------
int Get_xWorld_to_Grid (double xWorld) const { return( (int)(0.5 + (xWorld - Get_XMin()) / m_Cellsize) ); }
int Get_yWorld_to_Grid (double yWorld) const { return( (int)(0.5 + (yWorld - Get_YMin()) / m_Cellsize) ); }
bool Get_World_to_Grid (int &xGrid, int &yGrid, double xWorld, double yWorld) const
{
return( is_InGrid(xGrid = Get_xWorld_to_Grid(xWorld), yGrid = Get_yWorld_to_Grid(yWorld)) );
}
bool Get_World_to_Grid (int &xGrid, int &yGrid, TSG_Point ptWorld) const
{
return( is_InGrid(xGrid = Get_xWorld_to_Grid(ptWorld.x), yGrid = Get_yWorld_to_Grid(ptWorld.y)) );
}
//-----------------------------------------------------
bool Get_Neighbor_Pos (int Direction, int x, int y, int &xPos, int &yPos) const
{
return( is_InGrid(xPos = Get_xTo(Direction, x), yPos = Get_yTo(Direction, y)) );
}
int Get_xTo (int Direction, int x = 0) const
{
static int ix[8] = { 0, 1, 1, 1, 0,-1,-1,-1 };
return( x + ix[Direction % 8] );
}
int Get_yTo (int Direction, int y = 0) const
{
static int iy[8] = { 1, 1, 0,-1,-1,-1, 0, 1 };
return( y + iy[Direction % 8] );
}
int Get_xFrom (int Direction, int x = 0) const { return( Get_xTo(Direction + 4, x) ); }
int Get_yFrom (int Direction, int y = 0) const { return( Get_yTo(Direction + 4, y) ); }
int Get_xToSave (int Direction, int x) const { return( (x = Get_xTo (Direction, x)) < 0 ? 0 : (x >= m_NX ? m_NX - 1 : x) ); }
int Get_yToSave (int Direction, int y) const { return( (y = Get_yTo (Direction, y)) < 0 ? 0 : (y >= m_NY ? m_NY - 1 : y) ); }
int Get_xFromSave (int Direction, int x) const { return( (x = Get_xFrom(Direction, x)) < 0 ? 0 : (x >= m_NX ? m_NX - 1 : x) ); }
int Get_yFromSave (int Direction, int y) const { return( (y = Get_yFrom(Direction, y)) < 0 ? 0 : (y >= m_NY ? m_NY - 1 : y) ); }
bool is_InGrid (int x, int y) const { return( x >= 0 && x < m_NX && y >= 0 && y < m_NY ); }
bool is_InGrid (int x, int y, int Rand) const { return( x >= Rand && x < m_NX - Rand && y >= Rand && y < m_NY - Rand ); }
double Get_Length (int Direction) const { return( Direction % 2 ? m_Diagonal : m_Cellsize ); }
double Get_UnitLength (int Direction) const { return( Direction % 2 ? sqrt(2.0) : 1.0 ); }
private: ///////////////////////////////////////////////
int m_NX, m_NY, m_NCells;
double m_Cellsize, m_Cellarea, m_Diagonal;
CSG_Rect m_Extent;
CSG_String m_Name;
};
///////////////////////////////////////////////////////////
// //
// CSG_Grid //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
/**
* CSG_Grid is the data object created for raster handling.
*/
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Grid : public CSG_Data_Object
{
//---------------------------------------------------------
public: ///////////////////////////////////////////////
//-----------------------------------------------------
CSG_Grid(void);
CSG_Grid (const CSG_Grid &Grid);
bool Create (const CSG_Grid &Grid);
CSG_Grid (const SG_Char *File_Name, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
bool Create (const SG_Char *File_Name, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
CSG_Grid (CSG_Grid *pGrid, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
bool Create (CSG_Grid *pGrid, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
CSG_Grid (const CSG_Grid_System &System, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
bool Create (const CSG_Grid_System &System, TSG_Grid_Type Type = GRID_TYPE_Undefined, TSG_Grid_Memory_Type Memory_Type = GRID_MEMORY_Normal);
CSG_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);
bool Create (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);
//-----------------------------------------------------
virtual ~CSG_Grid(void);
virtual bool Destroy (void);
//-----------------------------------------------------
/** Data object type information.
*/
virtual TSG_Data_Object_Type Get_ObjectType (void) const { return( DATAOBJECT_TYPE_Grid ); }
//-----------------------------------------------------
// Data-Info...
TSG_Grid_Type Get_Type (void) const { return( m_Type ); }
int Get_nValueBytes (void) const { return( gSG_Grid_Type_Sizes[m_Type] ); }
void Set_Description (const SG_Char *String);
const SG_Char * Get_Description (void) const;
void Set_Unit (const SG_Char *String);
const SG_Char * Get_Unit (void) const;
const CSG_Grid_System & Get_System (void) const { return( m_System ); }
int Get_NX (void) const { return( m_System.Get_NX() ); }
int Get_NY (void) const { return( m_System.Get_NY() ); }
long Get_NCells (void) const { return( m_System.Get_NCells() ); }
double Get_Cellsize (void) const { return( m_System.Get_Cellsize() ); }
double Get_Cellarea (void) const { return( m_System.Get_Cellarea() ); }
const CSG_Rect & Get_Extent (void) const { return( m_System.Get_Extent() ); }
double Get_XMin (void) const { return( m_System.Get_XMin() ); }
double Get_XMax (void) const { return( m_System.Get_XMax() ); }
double Get_XRange (void) const { return( m_System.Get_XRange() ); }
double Get_YMin (void) const { return( m_System.Get_YMin() ); }
double Get_YMax (void) const { return( m_System.Get_YMax() ); }
double Get_YRange (void) const { return( m_System.Get_YRange() ); }
double Get_ZMin (bool bZFactor = false);
double Get_ZMax (bool bZFactor = false);
double Get_ZRange (bool bZFactor = false);
void Set_ZFactor (double Value);
double Get_ZFactor (void) const;
double Get_ArithMean (bool bZFactor = false);
double Get_Variance (bool bZFactor = false);
void Set_NoData_Value (double Value);
void Set_NoData_Value_Range (double loValue, double hiValue);
double Get_NoData_Value (void) const { return( m_NoData_Value ); }
double Get_NoData_hiValue (void) const { return( m_NoData_hiValue ); }
bool Update_Statistics (bool bEnforce = false);
virtual bool Save (const SG_Char *File_Name, int Format = GRID_FILE_FORMAT_Binary);
virtual bool Save (const SG_Char *File_Name, int Format, int xA, int yA, int xN, int yN);
//-----------------------------------------------------
// Checks...
virtual bool is_Valid (void) const;
TSG_Intersection is_Intersecting (const CSG_Rect &Extent) const;
TSG_Intersection is_Intersecting (const TSG_Rect &Extent) const;
TSG_Intersection is_Intersecting (double xMin, double yMin, double xMax, double yMax) const;
bool is_Compatible (CSG_Grid *pGrid) const;
bool is_Compatible (const CSG_Grid_System &System) const;
bool is_Compatible (int NX, int NY, double Cellsize, double xMin, double yMin) const;
bool is_InGrid(int x, int y, bool bCheckNoData = true) const { return( m_System.is_InGrid(x, y) && (!bCheckNoData || (bCheckNoData && !is_NoData(x, y))) ); }
bool is_InGrid_byPos (double xPos, double yPos) const { return( xPos >= Get_XMin() && xPos <= Get_XMax() && yPos >= Get_YMin() && yPos <= Get_YMax() ); }
bool is_InGrid_byPos (TSG_Point Position) const { return( is_InGrid_byPos(Position.x, Position.y) ); }
//-----------------------------------------------------
// Memory...
int Get_Buffer_Size (void) { return( LineBuffer_Count * _LineBuffer_Get_nBytes() ); }
bool Set_Buffer_Size (int Size);
bool Set_Cache (bool bOn);
bool is_Cached (void);
bool Set_Compression (bool bOn);
bool is_Compressed (void);
double Get_Compression_Ratio (void);
//-----------------------------------------------------
// Operations...
void Assign_NoData (void);
virtual bool Assign (double Value = 0.0);
virtual bool Assign (CSG_Data_Object *pObject);
virtual bool Assign (CSG_Grid *pGrid, TSG_Grid_Interpolation Interpolation);
void Flip (void);
void Mirror (void);
void Invert (void);
void Normalise (void);
void DeNormalise (double ArithMean, double Variance);
int Get_Gradient_NeighborDir (int x, int y, bool bMustBeLower = true) const;
bool Get_Gradient (int x, int y, double &Decline, double &Azimuth) const;
//-----------------------------------------------------
// Set update flag when modified...
virtual void Set_Modified (bool bFlag = true)
{
CSG_Data_Object::Set_Modified(bFlag);
if( bFlag )
{
m_bUpdate = true;
m_bSorted = false;
}
}
//-----------------------------------------------------
// Sort...
void Sort_Discard (void);
bool Get_Sorted (long Position, int &x, int &y, bool bDown = true, bool bCheckNoData = true)
{
if( Position >= 0 && Position < Get_NCells() && (m_bSorted || _Sort_Execute()) )
{
if( !bDown )
{
Position = Get_NCells() - Position - 1;
}
if( m_Sort_2b )
{
x = m_Sort_2b[0][Position];
y = m_Sort_2b[1][Position];
}
else
{
x = m_Sort_4b[0][Position];
y = m_Sort_4b[1][Position];
}
return( bCheckNoData ? !is_NoData(x, y) : true );
}
x = y = 0;
return( false );
}
double Get_Percentile (double Percent, bool bZFactor = false);
//-----------------------------------------------------
// No Data Value...
virtual bool is_NoData_Value (double Value) const
{
return( m_NoData_Value < m_NoData_hiValue ? m_NoData_Value <= Value && Value <= m_NoData_hiValue : Value == m_NoData_Value );
}
virtual bool is_NoData (int x, int y) const { return( is_NoData_Value(asDouble(x, y)) ); }
virtual bool is_NoData (long n) const { return( is_NoData_Value(asDouble( n)) ); }
virtual void Set_NoData (int x, int y) { Set_Value(x, y, m_NoData_Value ); }
virtual void Set_NoData (long n) { Set_Value( n, m_NoData_Value ); }
//-----------------------------------------------------
// Operators...
virtual CSG_Grid & operator = (const CSG_Grid &Grid);
virtual CSG_Grid & operator = (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 & Add (const CSG_Grid &Grid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -