📄 grid_value_reclassify.cpp
字号:
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CGrid_Value_Reclassify::ReclassRange(void)
{
bool otherOpt, noDataOpt, floating;
int x, y, opera;
double minValue, maxValue, value, others, noData, noDataValue, newValue;
minValue = Parameters("MIN")->asDouble();
maxValue = Parameters("MAX")->asDouble();
newValue = Parameters("RNEW")->asDouble();
others = Parameters("OTHERS")->asDouble();
noData = Parameters("NODATA")->asDouble();
otherOpt = Parameters("OTHEROPT")->asBool();
noDataOpt = Parameters("NODATAOPT")->asBool();
opera = Parameters("ROPERATOR")->asInt();
noDataValue = pInput->Get_NoData_Value();
if( (pInput->Get_Type() == GRID_TYPE_Double) || (pInput->Get_Type() == GRID_TYPE_Float) )
floating = true;
else
floating = false;
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
if( floating == true )
value = pInput->asDouble(x, y);
else
value = pInput->asInt(x, y);
if( opera == 0 ) // operator <=
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( minValue <= value && value <= maxValue ) // reclass old range
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
if( opera == 1 ) // operator <
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( minValue < value && value < maxValue ) // reclass old range
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
}
}
return( true );
}
//---------------------------------------------------------
bool CGrid_Value_Reclassify::ReclassSingle(void)
{
bool otherOpt, noDataOpt, floating;
int x, y, opera;
double oldValue, newValue, value, others, noData, noDataValue;
oldValue = Parameters("OLD")->asDouble();
newValue = Parameters("NEW")->asDouble();
others = Parameters("OTHERS")->asDouble();
noData = Parameters("NODATA")->asDouble();
otherOpt = Parameters("OTHEROPT")->asBool();
noDataOpt = Parameters("NODATAOPT")->asBool();
opera = Parameters("SOPERATOR")->asInt();
noDataValue = pInput->Get_NoData_Value();
if( (pInput->Get_Type() == GRID_TYPE_Double) || (pInput->Get_Type() == GRID_TYPE_Float) )
floating = true;
else
floating = false;
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
if( floating == true )
value = pInput->asDouble(x, y);
else
value = pInput->asInt(x, y);
if( opera == 0 ) // operator =
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( value == oldValue ) // reclass old value
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
if( opera == 1 ) // operator <
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( value < oldValue ) // reclass old value
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
if( opera == 2 ) // operator <=
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( value <= oldValue ) // reclass old value
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
if( opera == 3 ) // operator >=
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( value >= oldValue ) // reclass old value
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
if( opera == 4 ) // operator >
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( value > oldValue ) // reclass old value
pResult->Set_Value(x, y, newValue);
else if( otherOpt == true && value != noDataValue ) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
}
}
return( true );
}
//---------------------------------------------------------
#define MAX_CAT 128
//---------------------------------------------------------
bool CGrid_Value_Reclassify::ReclassTable(bool bUser)
{
bool set, otherOpt, noDataOpt;
int n, x, y, opera, recCount, count[MAX_CAT], field_Min, field_Max, field_Code;
double min[MAX_CAT], max[MAX_CAT], code[MAX_CAT], value, others, noData, noDataValue;
CSG_Table *pReTab;
CSG_Table_Record *pRecord = NULL;
if( bUser )
{
pReTab = Parameters("RETAB_2") ->asTable();
field_Min = Parameters("F_MIN") ->asInt();
field_Max = Parameters("F_MAX") ->asInt();
field_Code = Parameters("F_CODE") ->asInt();
}
else
{
pReTab = Parameters("RETAB") ->asTable();
field_Min = 0;
field_Max = 1;
field_Code = 2;
}
others = Parameters("OTHERS")->asDouble();
noData = Parameters("NODATA")->asDouble();
otherOpt = Parameters("OTHEROPT")->asBool();
noDataOpt = Parameters("NODATAOPT")->asBool();
opera = Parameters("TOPERATOR")->asInt();
noDataValue = pInput->Get_NoData_Value();
if( pReTab == NULL )
{
Error_Set(_TL("You must specify a reclass table with a minimium (field 1), a maximum (field 2) and a code value (field 3)!\n"));
return( false );
}
recCount = pReTab->Get_Record_Count();
if( recCount > MAX_CAT )
{
Error_Set(_TL("At the moment the reclass table is limited to 128 categories!\n"));
return( false );
}
if( recCount == 0 )
{
Error_Set(_TL("You must specify a reclass table with a minimium of one record!\n"));
return( false );
}
for(n=0; n<recCount ; n++) // initialize reclass arrays
{
pRecord = pReTab->Get_Record(n);
min[n] = pRecord->asDouble(field_Min);
max[n] = pRecord->asDouble(field_Max);
code[n] = pRecord->asDouble(field_Code);
count[n] = 0;
}
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
value = pInput->asDouble(x, y);
set = false;
for(n=0; n< recCount; n++) // reclass
{
if( opera == 0 ) // min <= value < max
{
if( value >= min[n] && value < max[n] )
{
pResult->Set_Value(x, y, code[n]);
set = true;
count[n] += 1;
break;
}
}
else if( opera == 1 ) // min <= value <= max
{
if( value >= min[n] && value <= max[n] )
{
pResult->Set_Value(x, y, code[n]);
set = true;
count[n] += 1;
break;
}
}
else if( opera == 2 ) // min < value <= max
{
if( value > min[n] && value <= max[n] )
{
pResult->Set_Value(x, y, code[n]);
set = true;
count[n] += 1;
break;
}
}
else if( opera == 3 ) // min < value < max
{
if( value > min[n] && value < max[n] )
{
pResult->Set_Value(x, y, code[n]);
set = true;
count[n] += 1;
break;
}
}
}
if( set == false )
{
if( noDataOpt == true && value == noDataValue ) // noData option
pResult->Set_Value(x, y, noData);
else if( otherOpt == true && value != noDataValue) // other values option
pResult->Set_Value(x, y, others);
else
pResult->Set_Value(x, y, value); // or original value
}
}
}
return (true);
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -