📄 flow_areaupslope.cpp
字号:
if( m_pDTM->is_InGrid(ix, iy, true) && (Flow = m_pFlow->asDouble(ix, iy)) > 0.0 )
{
m_pFlow->Set_Value(x, y, Flow);
}
}
}
//---------------------------------------------------------
void CFlow_AreaUpslope::Set_DInf(int x, int y)
{
double Slope, Aspect;
if( m_pDTM->Get_Gradient(x, y, Slope, Aspect) ) // && Aspect >= 0.0 )
{
int i, ix, iy, jx, jy;
double Flow;
i = (int)(Aspect / M_PI_045);
ix = m_pDTM->Get_System().Get_xTo(i, x);
iy = m_pDTM->Get_System().Get_yTo(i, y);
i++;
jx = m_pDTM->Get_System().Get_xTo(i, x);
jy = m_pDTM->Get_System().Get_yTo(i, y);
if( m_pDTM->is_InGrid(ix, iy) && m_pDTM->asDouble(ix, iy) < m_pDTM->asDouble(x, y)
&& m_pDTM->is_InGrid(jx, jy) && m_pDTM->asDouble(jx, jy) < m_pDTM->asDouble(x, y) )
{
Aspect = fmod(Aspect, M_PI_045) / M_PI_045;
Flow = m_pFlow->asDouble(ix, iy) * (1.0 - Aspect)
+ m_pFlow->asDouble(jx, jy) * ( Aspect);
if( Flow > 0.0 )
{
m_pFlow->Set_Value(x, y, Flow);
}
return;
}
}
Set_D8(x, y);
}
//---------------------------------------------------------
void CFlow_AreaUpslope::Set_MFD(int x, int y)
{
int i, ix, iy;
double z, d, f, dzSum, dz[8];
for(i=0, dzSum=0.0, z=m_pDTM->asDouble(x, y); i<8; i++)
{
dz[i] = 0.0;
ix = m_pDTM->Get_System().Get_xTo(i, x);
iy = m_pDTM->Get_System().Get_yTo(i, y);
if( m_pDTM->is_InGrid(ix, iy) && (d = z - m_pDTM->asDouble(ix, iy)) > 0.0 )
{
dzSum += (d = pow(d / m_pDTM->Get_System().Get_Length(i), m_MFD_Converge));
if( (f = m_pFlow->asDouble(ix, iy)) > 0.0 )
{
dz[i] = d * f;
}
}
}
if( dzSum > 0.0 )
{
for(i=0, d=0.0; i<8; i++)
{
if( dz[i] > 0.0 )
{
d += dz[i] / dzSum;
}
}
m_pFlow->Set_Value(x, y, d);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CFlow_AreaUpslope_Interactive::CFlow_AreaUpslope_Interactive(void)
{
Set_Name (_TL("Upslope Area"));
Set_Author (_TL("Copyrights (c) 2001 by Olaf Conrad"));
Set_Description (CSG_String::Format(SG_T("%s_______\n%s"), m_Calculator.Get_Description().c_str(),
_TL("Interactive version (left mouse clicks will trigger the calculation for the selected cell).")
));
//-----------------------------------------------------
Parameters.Add_Grid(
NULL , "ELEVATION" , _TL("Elevation"),
_TL(""),
PARAMETER_INPUT
);
Parameters.Add_Grid(
NULL , "SINKROUTE" , _TL("Sink Routes"),
_TL(""),
PARAMETER_INPUT_OPTIONAL
);
Parameters.Add_Grid(
NULL , "AREA" , _TL("Upslope Area"),
_TL(""),
PARAMETER_OUTPUT
);
Parameters.Add_Choice(
NULL , "METHOD" , _TL("Method"),
_TL(""),
m_Calculator.Get_Methods(), 2
);
Parameters.Add_Value(
NULL , "CONVERGE" , _TL("Convergence"),
_TL("Convergence factor for Multiple Flow Direction algorithm"),
PARAMETER_TYPE_Double , 1.1, 0.001, true
);
}
//---------------------------------------------------------
CFlow_AreaUpslope_Interactive::~CFlow_AreaUpslope_Interactive(void)
{}
//---------------------------------------------------------
bool CFlow_AreaUpslope_Interactive::On_Execute(void)
{
if( m_Calculator.Initialise(
Parameters("METHOD") ->asInt(),
Parameters("ELEVATION") ->asGrid(),
Parameters("SINKROUTE") ->asGrid(),
Parameters("AREA") ->asGrid(),
Parameters("CONVERGE") ->asDouble() ) )
{
DataObject_Set_Colors(Parameters("AREA")->asGrid(), 100, SG_COLORS_WHITE_BLUE);
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CFlow_AreaUpslope_Interactive::On_Execute_Finish(void)
{
return( m_Calculator.Finalise() );
}
//---------------------------------------------------------
bool CFlow_AreaUpslope_Interactive::On_Execute_Position(CSG_Point ptWorld, TSG_Module_Interactive_Mode Mode)
{
if( Mode == MODULE_INTERACTIVE_LDOWN && m_Calculator.Get_Area(Get_xGrid(), Get_yGrid()) )
{
DataObject_Update(Parameters("AREA")->asGrid(), 0.0, 100.0, true);
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CFlow_AreaUpslope_Area::CFlow_AreaUpslope_Area(void)
{
Set_Name (_TL("Upslope Area"));
Set_Author (_TL("Copyrights (c) 2001 by Olaf Conrad"));
Set_Description (CSG_String::Format(SG_T("%s_______\n%s"), m_Calculator.Get_Description().c_str(),
_TL("This version uses all valid cells (not \'no data\' values) of given target grid to determine the contributing area.")
));
//-----------------------------------------------------
Parameters.Add_Grid(
NULL , "TARGET" , _TL("Target Area"),
_TL(""),
PARAMETER_INPUT
);
Parameters.Add_Grid(
NULL , "ELEVATION" , _TL("Elevation"),
_TL(""),
PARAMETER_INPUT
);
Parameters.Add_Grid(
NULL , "SINKROUTE" , _TL("Sink Routes"),
_TL(""),
PARAMETER_INPUT_OPTIONAL
);
Parameters.Add_Grid(
NULL , "AREA" , _TL("Upslope Area"),
_TL(""),
PARAMETER_OUTPUT
);
Parameters.Add_Choice(
NULL , "METHOD" , _TL("Method"),
_TL(""),
m_Calculator.Get_Methods(), 2
);
Parameters.Add_Value(
NULL , "CONVERGE" , _TL("Convergence"),
_TL("Convergence factor for Multiple Flow Direction algorithm"),
PARAMETER_TYPE_Double , 1.1, 0.001, true
);
}
//---------------------------------------------------------
CFlow_AreaUpslope_Area::~CFlow_AreaUpslope_Area(void)
{}
//---------------------------------------------------------
bool CFlow_AreaUpslope_Area::On_Execute(void)
{
bool bResult = false;
//-----------------------------------------------------
if( m_Calculator.Initialise(
Parameters("METHOD") ->asInt(),
Parameters("ELEVATION") ->asGrid(),
Parameters("SINKROUTE") ->asGrid(),
Parameters("AREA") ->asGrid(),
Parameters("CONVERGE") ->asDouble() ) )
{
if( m_Calculator.Clr_Target() )
{
int x, y;
CSG_Grid *pTarget = Parameters("TARGET")->asGrid();
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
if( !pTarget->is_NoData(x, y) && m_Calculator.Add_Target(x, y) )
{
bResult = true;
}
}
}
if( bResult )
{
m_Calculator.Get_Area();
DataObject_Set_Colors(Parameters("AREA")->asGrid(), 100, SG_COLORS_WHITE_BLUE);
}
}
}
//-----------------------------------------------------
m_Calculator.Finalise();
return( bResult );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -