//--------------------------------------------------------- bool CGrid_Classify_Supervised::On_Execute(void) { //----------------------------------------------------- if( !Get_Features() ) { Error_Set(_TL("invalid features")); return( false ); } //----------------------------------------------------- CSG_Classifier_Supervised Classifier; if( !Set_Classifier(Classifier) ) { return( false ); } //----------------------------------------------------- CSG_Grid *pClasses = Parameters("CLASSES")->asGrid(); CSG_Grid *pQuality = Parameters("QUALITY")->asGrid(); pClasses->Set_NoData_Value(0); pClasses->Assign(0.0); //----------------------------------------------------- Process_Set_Text(_TL("prediction")); int Method = Parameters("METHOD")->asInt(); for(int y=0; y<Get_NY() && Set_Progress(y); y++) { #pragma omp parallel for for(int x=0; x<Get_NX(); x++) { int Class; double Quality; CSG_Vector Features(m_pFeatures->Get_Count()); if( Get_Features(x, y, Features) && Classifier.Get_Class(Features, Class, Quality, Method) ) { SG_GRID_PTR_SAFE_SET_VALUE(pClasses, x, y, 1 + Class); SG_GRID_PTR_SAFE_SET_VALUE(pQuality, x, y, Quality ); } else { SG_GRID_PTR_SAFE_SET_NODATA(pClasses, x, y); SG_GRID_PTR_SAFE_SET_NODATA(pQuality, x, y); } } } //----------------------------------------------------- return( Set_Classification(Classifier) ); }
//--------------------------------------------------------- bool CSoil_Texture::On_Execute(void) { //----------------------------------------------------- CSG_Grid *pSand = Parameters("SAND" )->asGrid(); CSG_Grid *pSilt = Parameters("SILT" )->asGrid(); CSG_Grid *pClay = Parameters("CLAY" )->asGrid(); CSG_Grid *pClass = Parameters("TEXTURE")->asGrid(); CSG_Grid *pSum = Parameters("SUM" )->asGrid(); //----------------------------------------------------- if( (pSand ? 1 : 0) + (pSilt ? 1 : 0) + (pClay ? 1 : 0) < 2 ) { Error_Set(_TL("at least two contents (sand, silt, clay) have to be given")); return( false ); } //----------------------------------------------------- pClass->Set_NoData_Value(-1.0); CSG_Parameter *pLUT = DataObject_Get_Parameter(pClass, "LUT"); if( pLUT && pLUT->asTable() ) { CSG_Table *pClasses = pLUT->asTable(); for(int iClass=0; iClass<12; iClass++) { CSG_Table_Record *pClass = pClasses->Get_Record(iClass); if( pClass == NULL ) { pClass = pClasses->Add_Record(); } pClass->Set_Value(0, Classes[iClass].Color); pClass->Set_Value(1, Classes[iClass].Name); pClass->Set_Value(2, Classes[iClass].Key); pClass->Set_Value(3, iClass); pClass->Set_Value(4, iClass); } while( pClasses->Get_Count() > 12 ) { pClasses->Del_Record(pClasses->Get_Count() - 1); } DataObject_Set_Parameter(pClass, pLUT); // Lookup Table DataObject_Set_Parameter(pClass, "COLORS_TYPE", 1); // Color Classification Type: Lookup Table } //----------------------------------------------------- for(int y=0; y<Get_NY() && Set_Progress(y); y++) { #pragma omp parallel for for(int x=0; x<Get_NX(); x++) { if( (pSand && pSand->is_NoData(x, y)) || (pSilt && pSilt->is_NoData(x, y)) || (pClay && pClay->is_NoData(x, y)) ) { SG_GRID_PTR_SAFE_SET_NODATA(pClass, x, y); SG_GRID_PTR_SAFE_SET_NODATA(pSum , x, y); } else { int Class = -1; double Sum = 100.0; if( pSand && pSilt && pClay ) { Class = Get_Texture(pSand->asDouble(x, y), pSilt->asDouble(x, y), pClay->asDouble(x, y), Sum); } else if( !pSilt ) { Class = Get_Texture_SandClay(pSand->asDouble(x, y), pClay->asDouble(x, y)); } else if( !pClay ) { Class = Get_Texture_SandSilt(pSand->asDouble(x, y), pSilt->asDouble(x, y)); } else if( !pSand ) { Class = Get_Texture_SiltClay(pSilt->asDouble(x, y), pClay->asDouble(x, y)); } SG_GRID_PTR_SAFE_SET_VALUE(pClass, x, y, Class); SG_GRID_PTR_SAFE_SET_VALUE(pSum , x, y, Sum ); } } } //----------------------------------------------------- return( true ); }