//--------------------------------------------------------- bool CSoil_Texture_Table::On_Execute(void) { //----------------------------------------------------- CSG_Table *pTable = Parameters("TABLE")->asTable(); int iSand = Parameters("SAND" )->asInt(); int iSilt = Parameters("SILT" )->asInt(); int iClay = Parameters("CLAY" )->asInt(); int iTexture = Parameters("TEXTURE")->asInt(); //----------------------------------------------------- if( (iSand >= 0 ? 1 : 0) + (iSilt >= 0 ? 1 : 0) + (iClay >= 0 ? 1 : 0) < 2 ) { Error_Set(_TL("at least two contents (sand, silt, clay) have to be given")); return( false ); } //----------------------------------------------------- if( iTexture < 0 ) { iTexture = pTable->Get_Field_Count(); pTable->Add_Field("TEXTURE", SG_DATATYPE_String); } //----------------------------------------------------- for(int i=0; i<pTable->Get_Count() && Set_Progress(i, pTable->Get_Count()); i++) { CSG_Table_Record *pRecord = pTable->Get_Record(i); if( (iSand >= 0 && pRecord->is_NoData(iSand)) || (iSilt >= 0 && pRecord->is_NoData(iSilt)) || (iClay >= 0 && pRecord->is_NoData(iClay)) ) { pRecord->Set_NoData(iTexture); } else { int Class = -1; if( iSand >= 0 && iSilt >= 0 && iClay >= 0 ) { double Sum; Class = Get_Texture(pRecord->asDouble(iSand), pRecord->asDouble(iSilt), pRecord->asDouble(iClay), Sum); } else if( iSilt < 0 ) { Class = Get_Texture_SandClay(pRecord->asDouble(iSand), pRecord->asDouble(iClay)); } else if( iClay < 0 ) { Class = Get_Texture_SandSilt(pRecord->asDouble(iSand), pRecord->asDouble(iSilt)); } else if( iSand < 0 ) { Class = Get_Texture_SiltClay(pRecord->asDouble(iSilt), pRecord->asDouble(iClay)); } pRecord->Set_Value (iTexture, Classes[Class].Key); } } DataObject_Update(pTable); //----------------------------------------------------- CSG_Parameter *pLUT = DataObject_Get_Parameter(pTable, "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].Name); pClass->Set_Value(3, Classes[iClass].Key); pClass->Set_Value(4, Classes[iClass].Key); } while( pClasses->Get_Count() > 12 ) { pClasses->Del_Record(pClasses->Get_Count() - 1); } DataObject_Set_Parameter(pTable, pLUT); // Lookup Table DataObject_Set_Parameter(pTable, "LUT_ATTRIB" , iTexture); // Lookup Table Attribute DataObject_Set_Parameter(pTable, "COLORS_TYPE", 1 ); // Color Classification Type: Lookup Table } //----------------------------------------------------- return( true ); }
//--------------------------------------------------------- bool CSoil_Texture::On_Execute(void) { CSG_Grid *pSand, *pSilt, *pClay, *pTexture, *pSum; //----------------------------------------------------- pSand = Parameters("SAND") ->asGrid(); pSilt = Parameters("SILT") ->asGrid(); pClay = Parameters("CLAY") ->asGrid(); pTexture = Parameters("TEXTURE") ->asGrid(); 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 ); } //----------------------------------------------------- pTexture->Set_NoData_Value(0.0); CSG_Parameters P; if( DataObject_Get_Parameters(pTexture, P) && P("COLORS_TYPE") && P("LUT") ) { CSG_Table *pLUT = P("LUT")->asTable(); for(int iClass=0; iClass<12; iClass++) { CSG_Table_Record *pClass; if( (pClass = pLUT->Get_Record(iClass)) == NULL ) { pClass = pLUT->Add_Record(); } pClass->Set_Value(0, Classes[iClass].Color); pClass->Set_Value(1, Classes[iClass].Name); pClass->Set_Value(2, Classes[iClass].Name); pClass->Set_Value(3, Classes[iClass].ID); pClass->Set_Value(4, Classes[iClass].ID); } while( pLUT->Get_Record_Count() > 12 ) { pLUT->Del_Record(pLUT->Get_Record_Count() - 1); } P("COLORS_TYPE")->Set_Value(1); // Color Classification Type: Lookup Table DataObject_Set_Parameters(pTexture, P); } //----------------------------------------------------- for(int y=0; y<Get_NY() && Set_Progress(y); y++) { for(int x=0; x<Get_NX(); x++) { int Texture = 0; double Sum = 0.0; if( !(pSand && pSand->is_NoData(x, y)) && !(pSilt && pSilt->is_NoData(x, y)) && !(pClay && pClay->is_NoData(x, y)) ) { double Sand = pSand ? pSand->asDouble(x, y) : 100.0 - (pSilt->asDouble(x, y) + pClay->asDouble(x, y)); double Silt = pSilt ? pSilt->asDouble(x, y) : 100.0 - (pSand->asDouble(x, y) + pClay->asDouble(x, y)); double Clay = pClay ? pClay->asDouble(x, y) : 100.0 - (pSand->asDouble(x, y) + pSilt->asDouble(x, y)); if( (Sum = Sand + Silt + Clay) > 0.0 ) { if( Sum != 100.0 ) { Sand *= 100.0 / Sum; Clay *= 100.0 / Sum; } Texture = Get_Texture(Sand, Clay); } } if( Texture ) { pTexture->Set_Value(x, y, Texture); if( pSum ) { pSum->Set_Value(x, y, Sum); } } else { pTexture->Set_NoData(x, y); if( pSum ) { pSum->Set_NoData(x, y); } } } } //----------------------------------------------------- return( true ); }
//--------------------------------------------------------- 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 ); }