//--------------------------------------------------------- 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 CChange_Detection::On_Execute(void) { bool bNoChange; int iInitial, iFinal; CSG_Matrix Identity; CSG_Table Initial, Final, *pChanges; CSG_Grid *pInitial, *pFinal, *pChange; //----------------------------------------------------- pInitial = Parameters("INITIAL") ->asGrid(); pFinal = Parameters("FINAL") ->asGrid(); pChange = Parameters("CHANGE") ->asGrid(); pChanges = Parameters("CHANGES") ->asTable(); bNoChange = Parameters("NOCHANGE")->asBool(); if( !Get_Classes(Initial, pInitial, true) ) { Error_Set(_TL("no class definitions for initial state")); return( false ); } if( !Get_Classes(Final, pFinal, false) ) { Error_Set(_TL("no class definitions for final state")); return( false ); } if( !Get_Changes(Initial, Final, pChanges, Identity) ) { return( false ); } //----------------------------------------------------- for(int y=0; y<Get_NY() && Set_Progress(y); y++) { for(int x=0; x<Get_NX(); x++) { iInitial = Get_Class(Initial, pInitial->asDouble(x, y)); iFinal = Get_Class(Final , pFinal ->asDouble(x, y)); if( bNoChange || !Identity[iInitial][iFinal] ) { pChanges->Get_Record(iInitial)->Add_Value(1 + iFinal, 1); pChange->Set_Value(x, y, (pChanges->Get_Field_Count() - 1) * iInitial + iFinal); } else { pChange->Set_Value(x, y, -1); } } } //----------------------------------------------------- CSG_Parameters P; if( DataObject_Get_Parameters(pChange, P) && P("COLORS_TYPE") && P("LUT") ) { CSG_Table *pLUT = P("LUT")->asTable(); CSG_Colors cRandom(pChanges->Get_Count()); cRandom.Random(); pLUT->Del_Records(); for(iInitial=0; iInitial<pChanges->Get_Count(); iInitial++) { CSG_Colors cRamp(pChanges->Get_Field_Count() - 1); cRamp.Set_Ramp(cRandom[iInitial], cRandom[iInitial]); cRamp.Set_Ramp_Brighness(225, 50); for(iFinal=0; iFinal<pChanges->Get_Field_Count()-1; iFinal++) { if( pChanges->Get_Record(iInitial)->asInt(1 + iFinal) > 0 ) { CSG_Table_Record *pClass = pLUT->Add_Record(); pClass->Set_Value(0, cRamp.Get_Color(iFinal)); pClass->Set_Value(1, CSG_String::Format(SG_T("%s >> %s"), pChanges->Get_Record(iInitial)->asString(0), pChanges->Get_Field_Name(1 + iFinal))); pClass->Set_Value(3, (pChanges->Get_Field_Count() - 1) * iInitial + iFinal); pClass->Set_Value(4, (pChanges->Get_Field_Count() - 1) * iInitial + iFinal); } } } P("COLORS_TYPE")->Set_Value(1); // Color Classification Type: Lookup Table DataObject_Set_Parameters(pChange, P); } //----------------------------------------------------- double Factor; switch( Parameters("OUTPUT")->asInt() ) { default: Factor = 1.0; break; // cells case 1: Factor = 100.0 / Get_NCells(); break; // percent case 2: Factor = M_SQR(Get_Cellsize()); break; // area } if( Factor != 1.0 ) { for(iInitial=0; iInitial<pChanges->Get_Count(); iInitial++) { for(iFinal=0; iFinal<pChanges->Get_Field_Count()-1; iFinal++) { pChanges->Get_Record(iInitial)->Mul_Value(1 + iFinal, Factor); } } } //----------------------------------------------------- pChanges ->Set_Name(CSG_String::Format(SG_T("%s [%s >> %s]"), _TL("Changes"), pInitial->Get_Name(), pFinal->Get_Name())); pChange ->Set_Name(CSG_String::Format(SG_T("%s [%s >> %s]"), _TL("Changes"), pInitial->Get_Name(), pFinal->Get_Name())); pChange ->Set_NoData_Value(-1); return( true ); }
//--------------------------------------------------------- bool CGrid_Class_Statistics_For_Polygons::On_Execute(void) { //----------------------------------------------------- CSG_Grid *pGrid = Parameters("GRID")->asGrid(); CSG_Shapes *pPolygons = Parameters("POLYGONS")->asShapes(); if( pPolygons->Get_Count() <= 0 || !pPolygons->Get_Extent().Intersects(pGrid->Get_Extent()) ) { Error_Set(_TL("no spatial intersection between grid and polygon layer")); return( false ); } //----------------------------------------------------- if( Parameters("RESULT")->asShapes() != NULL && Parameters("RESULT")->asShapes() != pPolygons ) { Process_Set_Text(_TL("copying polygons")); CSG_Shapes *pResult = Parameters("RESULT")->asShapes(); pResult->Create(SHAPE_TYPE_Polygon, CSG_String::Format("%s [%s]", pPolygons->Get_Name(), _TL("Grid Classes"))); for(int i=0; i<pPolygons->Get_Count() && Set_Progress(i, pPolygons->Get_Count()); i++) { pResult->Add_Shape(pPolygons->Get_Shape(i), SHAPE_COPY_GEOM); } pPolygons = pResult; } //----------------------------------------------------- int fStart = pPolygons->Get_Field_Count(); if( !Get_Classes(pGrid, pPolygons) ) { Error_Set(_TL("undefined grid classes")); return( false ); } //----------------------------------------------------- bool bCenter = Parameters("METHOD")->asInt() == 0; Process_Set_Text(_TL("calculating class areas")); //----------------------------------------------------- int x, y; TSG_Point p; for(y=0, p.y=Get_YMin(); y<Get_NY() && Set_Progress(y); y++, p.y+=Get_Cellsize()) { for(x=0, p.x=Get_XMin(); x<Get_NX(); x++, p.x+=Get_Cellsize()) { if( m_Classes.asInt(x, y) >= 0 ) { int fClass = fStart + m_Classes.asInt(x, y); #pragma omp parallel for for(int i=0; i<pPolygons->Get_Count(); i++) { CSG_Shape_Polygon *pPolygon = (CSG_Shape_Polygon *)pPolygons->Get_Shape(i); double Area = Get_Intersection(pPolygon, p, bCenter); if( Area > 0.0 ) { pPolygon->Add_Value(fClass, Area); } } } } } //----------------------------------------------------- m_Classes.Destroy(); DataObject_Update(pPolygons); return( true ); }