OperationImplementation::State UnaryMathRasterAndNumber::prepare(ExecutionContext *ctx,const SymbolTable &st) { OperationImplementation::prepare(ctx,st); IlwisTypes ptype = _expression.parm(0).valuetype(); if ( hasType(ptype,itNUMBER) ) { _case = otNUMBER; bool ok; _number = _expression.parm(0).value().toDouble(&ok); if (!ok) { ERROR2(ERR_NO_OBJECT_TYPE_FOR_2,"Numerical value", "UnaryMathRasterAndNumber operation"); _number = rUNDEF; return sPREPAREFAILED; } return sPREPARED; } else if ( hasType(ptype,itRASTER)) { QString raster = _expression.parm(0).value(); if (!_inputGC.prepare(raster)) { ERROR2(ERR_COULD_NOT_LOAD_2,raster,""); return sPREPAREFAILED; } OperationHelperRaster helper; _box = helper.initialize(_inputGC, _outputGC, itRASTERSIZE | itENVELOPE | itCOORDSYSTEM | itGEOREF); if ( !_outputGC.isValid()) { ERROR1(ERR_NO_INITIALIZED_1, "output rastercoverage"); return sPREPAREFAILED; } QString outputName = _expression.parm(0,false).value(); if ( outputName != sUNDEF) _outputGC->name(outputName); auto nrange = _inputGC->datadef().range<NumericRange>(); if (nrange.isNull()) return sPREPAREFAILED; NumericRange *newRange = constructRangeFrom(nrange); IDomain dom; if(!dom.prepare(_outputDomain)) return sPREPAREFAILED; _outputGC->datadefRef().domain(dom); _outputGC->datadefRef().range(newRange); for(quint32 i=0; i<_outputGC->size().zsize(); ++i){ QString index = _outputGC->stackDefinition().index(i); _outputGC->setBandDefinition(index,{dom, newRange->clone()}); } _case = otSPATIAL; return sPREPARED; } return sNOTPREPARED; }
bool BinaryMathRaster::prepareCoverageCoverage() { QString raster = _expression.parm(0).value(); if (!_inputGC1.prepare(raster)) { kernel()->issues()->log(TR(ERR_COULD_NOT_LOAD_2).arg(raster, "")); return false; } raster = _expression.parm(1).value(); if (!_inputGC2.prepare(raster)) { kernel()->issues()->log(TR(ERR_COULD_NOT_LOAD_2).arg(raster, "")); return false; } bool isNumeric = _inputGC1->datadef().domain<>()->ilwisType() == itNUMERICDOMAIN && _inputGC2->datadef().domain<>()->ilwisType() == itNUMERICDOMAIN; if (!isNumeric) return false; OperationHelperRaster helper; _box = helper.initialize(_inputGC1, _outputGC, itRASTERSIZE | itENVELOPE | itCOORDSYSTEM | itGEOREF); auto nrange1 = _inputGC1->datadef().range().dynamicCast<NumericRange>(); if (nrange1.isNull()) return false; auto nrange2 = _inputGC2->datadef().range().dynamicCast<NumericRange>(); if (nrange2.isNull()) return false; NumericRange *newRange = constructRangeFrom(nrange1, nrange2); IDomain dom; dom.prepare("value"); _outputGC->datadefRef().domain(dom); _outputGC->datadefRef().range(newRange); for(quint32 i = 0; i < _outputGC->size().zsize(); ++i){ QString index = _outputGC->stackDefinition().index(i); _outputGC->setBandDefinition(index,DataDefinition(dom,newRange->clone())); } _coveragecoverage = true; return true; }
bool BinaryMathRaster::prepareCoverageNumber(IlwisTypes ptype1, IlwisTypes ptype2) { int mindex = (ptype1 & itNUMBER) == 0 ? 0 : 1; int nindex = mindex ? 0 : 1; _firstorder = mindex > nindex; QString raster = _expression.parm(mindex).value(); if (!_inputGC1.prepare(raster)) { kernel()->issues()->log(TR(ERR_COULD_NOT_LOAD_2).arg(raster, "")); return false; } if(_inputGC1->datadef().domain<>()->ilwisType() != itNUMERICDOMAIN) return false; _number1 = _expression.parm(nindex).value().toDouble(); OperationHelperRaster helper; _box = helper.initialize(_inputGC1, _outputGC,itRASTERSIZE | itENVELOPE | itCOORDSYSTEM | itGEOREF); auto nrange = _inputGC1->datadef().range<NumericRange>(); if (nrange.isNull()) return false; NumericRange *newRange = constructRangeFrom(nrange, _number1); IDomain dom; dom.prepare("value"); _outputGC->datadefRef().domain(dom); _outputGC->datadefRef().range(newRange); for(quint32 i = 0; i < _outputGC->size().zsize(); ++i){ QString index = _outputGC->stackDefinition().index(i); _outputGC->setBandDefinition(index,DataDefinition(dom,newRange->clone())); } return true; }