bool PostgresqlFeatureCoverageLoader::loadData(FeatureCoverage *fcoverage) const { //qDebug() << "PostgresqlFeatureCoverageLoader::loadData()"; ITable table; PostgresqlDatabaseUtil pgUtil(_resource,_options); Resource tableResource = pgUtil.resourceForType(itFLATTABLE); table.prepare(tableResource, _options); PostgresqlTableLoader tableLoader(table->source(), _options); if (!tableLoader.loadData(table.ptr())) { ERROR1("Could not load table data for table '%1'", table->name()); return false; } // metadata already set it to correct number, creating new features will up the count agains; so reset to 0. fcoverage->setFeatureCount(itFEATURE, iUNDEF, FeatureInfo::ALLFEATURES); QList<MetaGeometryColumn> metaGeometries; pgUtil.getMetaForGeometryColumns(metaGeometries); QSqlQuery query = pgUtil.doQuery(selectGeometries(metaGeometries), "featurecoverageloader"); quint32 geometriesPerFeature = metaGeometries.size(); IDomain semantics; pgUtil.prepareSubFeatureSemantics(semantics, metaGeometries); while (query.next()) { if (geometriesPerFeature == 0) { fcoverage->newFeature(0); } else { // index 0 is root, indeces > 0 are subfeatures of root bool atRoot = true; SPFeatureI rootFeature; // iterate semantics to keep predefined order ItemRangeIterator iter(semantics->range<>().data()); while (iter.isValid()) { QString geomName = (*iter)->name(); ICoordinateSystem crs; std::for_each(metaGeometries.begin(), metaGeometries.end(), [&crs,geomName](MetaGeometryColumn c) { if (c.geomColumn == geomName) { crs = c.crs; } }); if (atRoot) { atRoot = false; geos::geom::Geometry *rootGeometry = createGeometry(query, geomName, crs); rootFeature = fcoverage->newFeature(rootGeometry, false); } else { geos::geom::Geometry *subGeometry = createGeometry(query, geomName, crs); rootFeature->createSubFeature(geomName,subGeometry); } ++iter; } } } fcoverage->attributesFromTable(table); return true; }
void OperationWorker::process(){ try { Operation op(_expression); SymbolTable tbl; ExecutionContext ctx; if(op->execute(&ctx, tbl)){ if ( ctx._results.size() > 0){ for(auto resultName : ctx._results){ Symbol symbol = tbl.getSymbol(resultName); if ( hasType(symbol._type, itNUMBER)){ result += symbol._var.toDouble(); }else if ( hasType(symbol._type, itSTRING)){ result += symbol._var.toString(); }else if ( hasType(symbol._type, (itCOVERAGE | itTABLE))){ if ( symbol._type == itRASTER){ IRasterCoverage raster = symbol._var.value<IRasterCoverage>(); if ( raster.isValid()) result = raster->source().url().toString(); }else if(symbol._type == itTABLE){ ITable table = symbol._var.value<ITable>(); if(table.isValid()) result = table->source().url().toString(); } } } } kernel()->issues()->log(QString(TR("Operation has executed succesfully")), IssueObject::itError); }else { qDebug() << "operation failed"; } emit finished(); }catch(const ErrorObject& err){ } emit finished(); }