bool CRealArea::On_Execute(void) { CSG_Grid *pDEM = Parameters("DEM" )->asGrid(); CSG_Grid *pArea = Parameters("AREA")->asGrid(); for(int y=0; y<Get_NY() && Set_Progress(y); y++) { for(int x=0; x<Get_NX(); x++) { double s, a; if( pDEM->Get_Gradient(x, y, s, a) ) { pArea->Set_Value(x, y, Get_System()->Get_Cellarea() / cos(s)); } else { pArea->Set_NoData(x,y); } } } return( true ); }
//--------------------------------------------------------- bool CWaterRetentionCapacity::On_Execute(void) { CSG_Shapes *pInput = Parameters("SHAPES")->asShapes(); CSG_Shapes *pOutput = Parameters("OUTPUT")->asShapes(); if( pInput->Get_Field_Count() < 5 ) { Error_Set(_TL("Plot hole data has to provide at the very least five attributes (horizon depth, TF, L, Ar, Mo).")); return( false ); } pOutput->Create(SHAPE_TYPE_Point, _TL("Water Retention Capacity")); pOutput->Add_Field("CCC" , SG_DATATYPE_Double); pOutput->Add_Field("CIL" , SG_DATATYPE_Double); pOutput->Add_Field("Permeability" , SG_DATATYPE_Double); pOutput->Add_Field("Equivalent Moisture" , SG_DATATYPE_Double); pOutput->Add_Field("Water Retention Capacity", SG_DATATYPE_Double); //----------------------------------------------------- CSG_Grid *pDEM = Parameters("DEM")->asGrid(); CSG_Matrix Data(5, pInput->Get_Field_Count() / 5); for(int iPoint=0; iPoint<pInput->Get_Count(); iPoint++) { CSG_Shape *pPoint = pInput->Get_Shape(iPoint); for(int iHorizon=0, n=0; iHorizon<Data.Get_NRows(); iHorizon++, n+=5) { for(int i=0; i<5; i++) { Data[iHorizon][i] = pPoint->asDouble(n + i); } } double Slope, Aspect; if( !pDEM->Get_Gradient(pPoint->Get_Point(0), Slope, Aspect, GRID_RESAMPLING_BSpline) ) { Slope = 0.0; } Get_WaterRetention(Data, 1. - tan(Slope), pOutput->Add_Shape(pPoint, SHAPE_COPY_GEOM)); } //----------------------------------------------------- CSG_Grid *pRetention = Parameters("RETENTION")->asGrid(); if( pRetention ) { switch( Parameters("INTERPOL")->asInt() ) { default: // Multlevel B-Spline Interpolation SG_RUN_TOOL_ExitOnError("grid_spline", 4, SG_TOOL_PARAMETER_SET("SHAPES" , pOutput) && SG_TOOL_PARAMETER_SET("FIELD" , pOutput->Get_Field_Count() - 1) && SG_TOOL_PARAMETER_SET("TARGET_DEFINITION", 1) // grid or grid system && SG_TOOL_PARAMETER_SET("TARGET_OUT_GRID" , pRetention) ); break; case 1: // Inverse Distance Weighted SG_RUN_TOOL_ExitOnError("grid_gridding", 1, SG_TOOL_PARAMETER_SET("SHAPES" , pOutput) && SG_TOOL_PARAMETER_SET("FIELD" , pOutput->Get_Field_Count() - 1) && SG_TOOL_PARAMETER_SET("TARGET_DEFINITION", 1) // grid or grid system && SG_TOOL_PARAMETER_SET("TARGET_OUT_GRID" , pRetention) && SG_TOOL_PARAMETER_SET("SEARCH_RANGE" , 1) // global && SG_TOOL_PARAMETER_SET("SEARCH_POINTS_ALL", 1) // all points within search distance ); break; } if( Parameters("SLOPECORR")->asBool() ) { #pragma omp parallel for for(int y=0; y<Get_NY(); y++) { for(int x=0; x<Get_NX(); x++) { if( !pRetention->is_NoData(x, y) ) { double Slope, Aspect; if( !pDEM->Get_Gradient(x, y, Slope, Aspect) ) { Slope = 0.0; } pRetention->Mul_Value(x, y, 1. - tan(Slope)); } } } } } //----------------------------------------------------- return( true ); }
//--------------------------------------------------------- bool CTC_Classification::On_Execute(void) { //----------------------------------------------------- m_pSlope = Parameters("SLOPE" )->asGrid(); m_pConvexity = Parameters("CONVEXITY")->asGrid(); m_pTexture = Parameters("TEXTURE" )->asGrid(); if( (!m_pSlope || !m_pConvexity || !m_pTexture) && !Parameters("DEM")->asGrid() ) { return( false ); } //----------------------------------------------------- CSG_Grid Slope; if( !m_pSlope ) { Slope.Create(*Get_System()); m_pSlope = &Slope; CSG_Grid *pDEM = Parameters("DEM")->asGrid(); for(int y=0; y<Get_NY() && Set_Progress(y); y++) { #pragma omp parallel for for(int x=0; x<Get_NX(); x++) { double s, a; if( pDEM->Get_Gradient(x, y, s, a) ) { Slope.Set_Value(x, y, s); } else { Slope.Set_NoData(x, y); } } } } //----------------------------------------------------- if( !m_pConvexity || Parameters("CONV_RECALC")->asBool() ) { CTC_Convexity c; c.Set_Parameter( "DEM", Parameters("DEM")); c.Set_Parameter( "SCALE", Parameters("CONV_SCALE")); c.Set_Parameter( "KERNEL", Parameters("CONV_KERNEL")); c.Set_Parameter( "TYPE", Parameters("CONV_TYPE")); c.Set_Parameter( "EPSILON", Parameters("CONV_EPSILON")); c.Set_Parameter("CONVEXITY", m_pConvexity); if( !c.Execute() ) { return( false ); } Parameters("CONVEXITY")->Set_Value(m_pConvexity = c.Get_Parameters()->Get_Parameter("CONVEXITY")->asGrid()); } //----------------------------------------------------- if( !m_pTexture || Parameters("TEXT_RECALC")->asBool() ) { CTC_Texture c; c.Set_Parameter( "DEM", Parameters("DEM")); c.Set_Parameter( "SCALE", Parameters("TEXT_SCALE")); c.Set_Parameter("EPSILON", Parameters("TEXT_EPSILON")); c.Set_Parameter("TEXTURE", m_pTexture); if( !c.Execute() ) { return( false ); } Parameters("TEXTURE")->Set_Value(m_pTexture = c.Get_Parameters()->Get_Parameter("TEXTURE")->asGrid()); } //----------------------------------------------------- return( Get_Classes() ); }
bool CWaterRetentionCapacity::On_Execute(void){ int i,j; int x,y; int iField; int iShape; int iRows; float fValue = 0; float **pData; int iX, iY; float fC; double dSlope,dAspect; CSG_Shape* pShape; CSG_Shapes* pShapes = Parameters("SHAPES")->asShapes(); CSG_Grid* pDEM = Parameters("DEM")->asGrid(); m_pRetention = Parameters("RETENTION")->asGrid(); m_pSlope = SG_Create_Grid(pDEM); m_pOutput = Parameters("OUTPUT")->asShapes(); m_pOutput->Assign(pShapes); m_pOutput->Add_Field("CCC", SG_DATATYPE_Double); m_pOutput->Add_Field("CIL", SG_DATATYPE_Double); m_pOutput->Add_Field(_TL("Permeability"), SG_DATATYPE_Double); m_pOutput->Add_Field(_TL("Equivalent Moisture"), SG_DATATYPE_Double); m_pOutput->Add_Field(_TL("Water Retention Capacity"), SG_DATATYPE_Double); for(y=0; y<Get_NY() && Set_Progress(y); y++){ for(x=0; x<Get_NX(); x++){ if( pDEM->Get_Gradient(x, y, dSlope, dAspect) ){ m_pSlope->Set_Value(x, y, dSlope); } else{ m_pSlope->Set_NoData(x, y); } } } iRows = pShapes->Get_Field_Count() / 5; pData = new float*[iRows]; for (iShape = 0; iShape < pShapes->Get_Count(); iShape++){ pShape = pShapes->Get_Shape(iShape); for (i = 0; i< iRows; i++){ pData[i] = new float[5]; for (j = 0; j < 5; j++){ pData[i][j] = 0; try{ pData[i][j] = pShape->asFloat(j+i*5); }//try catch(...){} }//for }//for iX = (int)((pShape->Get_Point(0).x - pDEM->Get_XMin())/pDEM->Get_Cellsize()); iY = (int)((pShape->Get_Point(0).y - pDEM->Get_YMin())/pDEM->Get_Cellsize()); fC = (float)(1. - tan(m_pSlope->asFloat(iX,iY,false))); pShape = m_pOutput->Get_Shape(iShape); CalculateWaterRetention(pData, iRows, fC, pShape); }//for iField = m_pOutput->Get_Field_Count()-1; CIDW IDW; IDW.setParameters(m_pRetention, m_pOutput, iField); IDW.Interpolate(); CorrectWithSlope(); return true; }//method