//--------------------------------------------------------- bool CPolygon_Line_Intersection::On_Execute(void) { CSG_Shapes *pPolygons; //-------------------------------------------------------- pPolygons = Parameters("POLYGONS") ->asShapes(); m_pLines = Parameters("LINES") ->asShapes(); m_pIntersection = Parameters("INTERSECT") ->asShapes(); //-------------------------------------------------------- if( !m_pLines ->is_Valid() || m_pLines ->Get_Count() < 1 || !pPolygons->is_Valid() || pPolygons->Get_Count() < 1 || m_pLines->Get_Extent().Intersects(pPolygons->Get_Extent()) == INTERSECTION_None ) { Error_Set(_TL("no shapes for intersection found")); return( false ); } //-------------------------------------------------------- m_pIntersection->Create(SHAPE_TYPE_Polygon, CSG_String::Format(SG_T("%s [%s: %s]"), pPolygons->Get_Name(), _TL("Intersection"), m_pLines->Get_Name()), pPolygons ); //-------------------------------------------------------- for(int iPolygon=0; iPolygon<pPolygons->Get_Count() && Set_Progress(iPolygon, pPolygons->Get_Count()); iPolygon++) { if( !Get_Intersection((CSG_Shape_Polygon *)pPolygons->Get_Shape(iPolygon)) ) { m_pIntersection->Add_Shape(pPolygons->Get_Shape(iPolygon)); } } return( true ); }
//--------------------------------------------------------- bool CPolygon_Intersection::On_Execute(void) { CSG_String sName; m_pShapes_A = Parameters("SHAPES_A") ->asShapes(); m_pShapes_B = Parameters("SHAPES_B") ->asShapes(); m_pShapes_AB = Parameters("SHAPES_AB") ->asShapes(); m_bSplitParts = Parameters("SPLITPARTS") ->asBool(); m_iField_A = Parameters("FIELD_A") ->asInt(); if( m_iField_A >= m_pShapes_A->Get_Field_Count() ) { m_iField_A = -1; } m_iField_B = Parameters("FIELD_B") ->asInt(); if( m_iField_B >= m_pShapes_B->Get_Field_Count() ) { m_iField_B = -1; } if( m_pShapes_A->Get_Type() == SHAPE_TYPE_Polygon && m_pShapes_A->is_Valid() && m_pShapes_B->Get_Type() == SHAPE_TYPE_Polygon && m_pShapes_B->is_Valid() ) { m_pShapes_AB->Create(SHAPE_TYPE_Polygon); m_pShapes_AB->Add_Field("ID" , SG_DATATYPE_Int); m_pShapes_AB->Add_Field("ID_A" , SG_DATATYPE_Int); m_pShapes_AB->Add_Field("ID_B" , SG_DATATYPE_Int); m_pShapes_AB->Add_Field("ID_AB" , SG_DATATYPE_Int); if( m_iField_A >= 0 ) { m_pShapes_AB->Add_Field(m_pShapes_A->Get_Field_Name(m_iField_A), m_pShapes_A->Get_Field_Type(m_iField_A)); } if( m_iField_B >= 0 ) { m_pShapes_AB->Add_Field(m_pShapes_B->Get_Field_Name(m_iField_B), m_pShapes_B->Get_Field_Type(m_iField_B)); } //------------------------------------------------- switch( Parameters("METHOD")->asInt() ) { //------------------------------------------------- case 0: // Complete Intersection... sName.Printf(SG_T("%s [%s]-[%s]"), _TL("Intersection"), m_pShapes_A->Get_Name(), m_pShapes_B->Get_Name()); Get_Intersection(m_pShapes_A, m_pShapes_B, MODE_FIRST); Get_Difference (m_pShapes_A, m_pShapes_B, MODE_FIRST); Get_Difference (m_pShapes_B, m_pShapes_A, MODE_SECOND); break; //------------------------------------------------- case 1: // Intersection... sName.Printf(SG_T("%s [%s]-[%s]"), _TL("Intersection"), m_pShapes_A->Get_Name(), m_pShapes_B->Get_Name()); Get_Intersection(m_pShapes_A, m_pShapes_B, MODE_FIRST); break; //------------------------------------------------- case 2: // Difference A - B... sName.Printf(SG_T("%s [%s]-[%s]"), _TL("Difference"), m_pShapes_A->Get_Name(), m_pShapes_B->Get_Name()); Get_Difference (m_pShapes_A, m_pShapes_B, MODE_FIRST); break; //------------------------------------------------- case 3: // Difference B - A... sName.Printf(SG_T("%s [%s]-[%s]"), _TL("Difference"), m_pShapes_B->Get_Name(), m_pShapes_A->Get_Name()); Get_Difference (m_pShapes_B, m_pShapes_A, MODE_SECOND); break; } //------------------------------------------------- m_pShapes_AB->Set_Name(sName); return( m_pShapes_AB->Get_Count() > 0 ); } return( false ); }/**/
//--------------------------------------------------------- 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 ); }