ITable FlatTable::copyTable(const QString &nm) { QString url; if ( nm.indexOf(ANONYMOUS_PREFIX) == 0){ url = INTERNAL_CATALOG + "/" + Identity::newAnonymousName(); }else if ( nm.indexOf("://") != -1){ url = nm; }else if ( nm != "" && nm != sUNDEF) url = INTERNAL_CATALOG + "/" + (nm != sUNDEF ? name() : nm); IFlatTable tbl; if (initLoad()){ if ( url != "") tbl.prepare(url); else tbl.prepare(); for(int i=0; i < columnCount(); ++i){ tbl->addColumn(columndefinition(i)); } int i = 0; for(auto record : _datagrid){ tbl->record(i++, record); } } return tbl; }
bool MapCalc::execute(ExecutionContext *ctx, SymbolTable& symTable) { if (_prepState == sNOTPREPARED) if((_prepState = prepare(ctx, symTable)) != sPREPARED) return false; PixelIterator iterOut(_outputRaster); PixelIterator iterEnd = end(iterOut); while(iterOut != iterEnd) { double v = calc(); *iterOut = v; ++iterOut; for(auto& item : _inputRasters){ ++(item.second); } updateTranquilizer(iterOut.linearPosition(), 1000); } if ( _outputRaster->datadef().domain()->ilwisType() == itNUMERICDOMAIN){ double rmin = rUNDEF, rmax= rUNDEF; bool isInt = true; for(double v : _outputRaster ){ rmin = Ilwis::min(rmin, v); rmax = Ilwis::max(rmax, v); if ( v != rUNDEF){ isInt &= std::abs((qint64)v - v) <EPS8; } } NumericRange *range = new NumericRange(rmin,rmax, isInt ? 1 : 0); _outputRaster->datadefRef().range(range); }else { IFlatTable tbl; tbl.prepare(); tbl->addColumn(_outputRaster->primaryKey(),_outputRaster->datadef().domain()); int rec = 0; ItemRangeIterator iter(_outputRaster->datadef().range<>().data()); while (iter.isValid()) { SPDomainItem item = (*iter); tbl->setCell(0,rec++,item->raw()); ++iter; } _outputRaster->setAttributes(tbl); } QVariant value; value.setValue<IRasterCoverage>(_outputRaster); logOperation(_outputRaster, _expression); ctx->setOutput(symTable,value,_outputRaster->name(), itRASTER,_outputRaster->resource() ); return true; }
Ilwis::OperationImplementation::State ColumnUnaryOperation::prepare(ExecutionContext *ctx, const SymbolTable &) { QString table = _expression.parm(0).value(); if (!_inputTable.prepare(table)) { ERROR2(ERR_COULD_NOT_LOAD_2,table,""); return sPREPAREFAILED; } const Parameter& parm1 = _expression.parm(1); bool ok = true; ColumnDefinition def1; if ( hasType(parm1.valuetype(),itNUMBER)){ _number1 = parm1.value().toDouble(&ok); } else{ _column1 = parm1.value(); def1 = _inputTable->columndefinition(_column1); } if (!(hasType(def1.datadef().domain<>()->valueType(),itNUMBER))){ ERROR2(ERR_NOT_COMPATIBLE2, TR("column"), _expression.name()); return sPREPAREFAILED; } if ( _expression.parameterCount() < 4){ _outColumn = _expression.parm(2).value(); }else{ _outColumn = _expression.parm(3).value(); } _method = toMethod(_expression.parm(2).value()); if ( _method == NumericStatistics::pLAST) { ERROR2(ERR_ILLEGAL_VALUE_2, "parameter value", " aggregation method"); return sPREPAREFAILED; } QString outName = _expression.parm(0, false).value(); if(table != outName){ if (outName == sUNDEF) { IFlatTable ftable; ftable.prepare(); _outputTable = ftable; }else if(!_outputTable.prepare(outName)) {// output table doesnt need to exists _outputTable.prepare(QString("ilwis://internalcatalog/%1").arg(outName), _inputTable->ilwisType()); _outputTable->name(outName); } } else{ _outputTable = _inputTable; } NumericRange *newRange = 0; int index = _outputTable->columnIndex(_outColumn); IDomain dom; dom.prepare("value"); ColumnDefinition coldef(_outColumn,dom, index == iUNDEF ? _outputTable->columnCount() : index); newRange = constructRangeFrom(def1.datadef().range<NumericRange>(), _number1); coldef.datadef().range(newRange); if ( index == iUNDEF) _outputTable->addColumn(coldef); else _outputTable->columndefinition(index) = coldef; return sPREPARED; }