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; }