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