예제 #1
0
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;
}
예제 #2
0
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;
}