bool GdalFeatureConnector::loadMetaData(Ilwis::IlwisObject *data,const IOOptions& options){ if(!CoverageConnector::loadMetaData(data, options)) return false; FeatureCoverage *fcoverage = static_cast<FeatureCoverage *>(data); fcoverage->setFeatureCount(itFEATURE, iUNDEF, FeatureInfo::ALLFEATURES); OGRLayerH hLayer = getLayerHandle(); if ( hLayer) { //feature types IlwisTypes type = translateOGRType(gdal()->getLayerGeometry(hLayer)); if (type == itUNKNOWN){ WARN(QString("Unknown feature type of layer %1 from: %2").arg(0).arg(_filename.toString())); }else{ fcoverage->featureTypes(type); } //feature counts int temp = gdal()->getFeatureCount(hLayer, FALSE);//TRUE to FORCE databases to scan whole layer, FALSe can end up in -1 for unknown result if (temp == -1){ WARN(QString("Couldn't determine feature count of layer %1 from meta data of %2").arg(0).arg(_filename.toString())); }else{ int featureCount = fcoverage->featureCount(type); featureCount += temp; fcoverage->setFeatureCount(type, featureCount,0); // subgeometries are not known at this level } //attribute table ITable attTable; Resource resource(_filename, itFLATTABLE); if(!attTable.prepare(resource,{"asflattable", true})) {//will load whole meta data of the table ERROR1(ERR_NO_INITIALIZED_1,resource.name()); return false; } fcoverage->setAttributes(attTable); //layer envelopes/extents Envelope bbox; OGREnvelope envelope;//might sometimes be supported as 3D now only posssible from OGRGeometry OGRErr err = gdal()->getLayerExtent(hLayer, &envelope , FALSE);//TRUE to FORCE if (err != OGRERR_NONE){ if (err == OGRERR_FAILURE){//on an empty layer or if simply too expensive(FORECE=FALSE) OGR_L_GetExtent may return OGRERR_FAILURE WARN(QString("Couldn't determine the extent of layer %1 from meta data of %2").arg(0).arg(_filename.toString())); }else{ ERROR0(QString("Couldn't load extent of layer %1 from %2: %3").arg(0).arg(_filename.toString()).arg(gdal()->translateOGRERR(err))); } }else{ bbox = Envelope(Coordinate(envelope.MinX,envelope.MinY),Coordinate(envelope.MaxX,envelope.MaxY)); } fcoverage->envelope(bbox); // fcoverage->coordinateSystem()->envelope(bbox); } gdal()->closeFile(sourceRef().toLocalFile(), data->id()); return true; }
bool GdalFeatureConnector::loadData(IlwisObject* data, const IOOptions &){ if(!GdalConnector::loadMetaData(data, IOOptions())) return false; bool ok = true; FeatureCoverage *fcoverage = static_cast<FeatureCoverage *>(data); if ( fcoverage->isValid() ) { ITable attTable = fcoverage->attributeTable(); if (!attTable.isValid()){ ERROR2(ERR_NO_INITIALIZED_2,"attribute table",_filename.toString()); return false; } fcoverage->setFeatureCount(itFEATURE, iUNDEF, FeatureInfo::ALLFEATURES); // metadata already set it to correct number, creating new features will up the count agains; so reset to 0. OGRLayerH hLayer = getLayerHandle(); if ( hLayer) { GdalTableLoader loader; attTable->dataLoaded(true); // new table, dont want any loading behaviour loader.setColumnCallbacks(attTable.ptr(), hLayer); std::vector<QVariant> record(attTable->columnCount()); OGRFeatureH hFeature = 0; gdal()->resetReading(hLayer); //each FEATURE try { while( (hFeature = gdal()->getNextFeature(hLayer)) != NULL){ loader.loadRecord(attTable.ptr(), hFeature, record); geos::geom::Geometry * geometry = fillFeature(fcoverage, gdal()->getGeometryRef(hFeature)); if (geometry){ auto feature = fcoverage->newFeature(geometry, false); feature->record(record); }else{ ERROR1("GDAL error during load of binary data: no geometry detected for feature in %1", _filename.toString()); } gdal()->destroyFeature( hFeature ); } } catch (FeatureCreationError& ) { gdal()->destroyFeature( hFeature ); ok = false; } } //layer envelopes/extents Envelope bbox; OGREnvelope envelope;//might sometimes be supported as 3D now only posssible from OGRGeometry OGRErr err = gdal()->getLayerExtent(hLayer, &envelope , TRUE);//TRUE to FORCE if (err != OGRERR_NONE && fcoverage->featureCount() != 0){ ERROR0(QString("Couldn't load extent of a layer from %1 after binary was loaded: %2").arg(_filename.toString()).arg(gdal()->translateOGRERR(err))); }else{ bbox = Envelope(Coordinate(envelope.MinX,envelope.MinY),Coordinate(envelope.MaxX,envelope.MaxY)); } fcoverage->envelope(bbox); } gdal()->closeFile(sourceRef().toLocalFile(), data->id()); _binaryIsLoaded = ok; return ok; }