bool FeatureConnector::loadBinaryData(Ilwis::IlwisObject *obj) { if ( obj == nullptr) return false; FeatureCoverage *fcoverage = static_cast<FeatureCoverage *>(obj); QString file = _odf->value("BaseMap", "AttributeTable"); ITable extTable; if ( file != sUNDEF) { if(!extTable.prepare(file)){ kernel()->issues()->log(file,TR(ERR_NO_INITIALIZED_1).arg(file),IssueObject::itWarning); return false; } } bool ok = false; if (fcoverage->featureTypes() == itPOINT) ok = loadBinaryPoints(fcoverage); else if (fcoverage->featureTypes() == itLINE) ok = loadBinarySegments(fcoverage); else if (fcoverage->featureTypes() == itPOLYGON) ok = loadBinaryPolygons(fcoverage); if ( ok && extTable.isValid()) { ITable attTbl = fcoverage->attributeTable(); quint32 keyIndex = attTbl->columnIndex(COVERAGEKEYCOLUMN); for(quint32 rowExt=0; rowExt < extTable->records(); ++rowExt) { vector<QVariant> rec = extTable->record(rowExt); for(quint32 rowAtt = 0; rowAtt < attTbl->records(); ++rowAtt ) { if ( attTbl->cell(keyIndex, rowAtt) == rowExt + 1) { attTbl->record(rowAtt,rec); } } } } return ok; }
bool FeatureConnector::loadMetaData(Ilwis::IlwisObject *obj) { bool ok = CoverageConnector::loadMetaData(obj); if ( !ok) return false; FeatureCoverage *fcoverage = static_cast<FeatureCoverage *>(obj); IlwisTypes coverageType = itPOINT; int features = _odf->value("PointMap","Points").toInt(&ok); if (!ok) { coverageType = itLINE; features = _odf->value("SegmentMapStore","Segments").toInt(&ok); if (!ok) { coverageType = itPOLYGON; features = _odf->value("PolygonMapStore","Polygons").toInt(&ok); } } if (ok){ fcoverage->featureTypes(coverageType); fcoverage->setFeatureCount(coverageType, features); } else return ERROR2(ERR_INVALID_PROPERTY_FOR_2,"Records",obj->name()); ITable tbl = fcoverage->attributeTable(); tbl->setRows(fcoverage->featureCount()); return true; }
bool FeatureConnector::loadMetaData(Ilwis::IlwisObject *obj,const IOOptions& options) { bool ok = CoverageConnector::loadMetaData(obj, options); if ( !ok) return false; FeatureCoverage *fcoverage = static_cast<FeatureCoverage *>(obj); fcoverage->setFeatureCount(itFEATURE, iUNDEF, FeatureInfo::ALLFEATURES); IlwisTypes coverageType = itPOINT; int features = _odf->value("PointMap","Points").toInt(&ok); if (!ok) { coverageType = itPOLYGON; features = _odf->value("PolygonMapStore","Polygons").toInt(&ok); if (!ok) { coverageType = itLINE; features = _odf->value("SegmentMapStore","Segments").toInt(&ok); } } if (ok){ // overwrite with the correct value from the attribute table if available (without computing it by reading the binary data!) if (hasProperty("TableRecordCount")) features = getProperty("TableRecordCount").toInt(); fcoverage->featureTypes(coverageType); fcoverage->setFeatureCount(coverageType, features,0); } else return ERROR2(ERR_INVALID_PROPERTY_FOR_2,"Records",obj->name()); //ITable tbl = fcoverage->attributeTable(); //tbl->recordCount(fcoverage->featureCount(itFEATURE,true)); return true; }
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 FeatureConnector::loadData(Ilwis::IlwisObject *obj, const IOOptions &) { if ( obj == nullptr) return false; FeatureCoverage *fcoverage = static_cast<FeatureCoverage *>(obj); QString file = _odf->value("BaseMap", "AttributeTable"); ITable extTable; if ( file != sUNDEF) { if(!extTable.prepare(file)){ kernel()->issues()->log(file,TR(ERR_NO_INITIALIZED_1).arg(file),IssueObject::itWarning); return false; } } bool ok = false; try { _binaryIsLoaded = true; // to prevent any subsequent calls to this routine while loading (which mat trigger it). if (fcoverage->featureTypes() == itPOINT) ok = loadBinaryPoints(fcoverage); else if (fcoverage->featureTypes() == itLINE) ok = loadBinarySegments(fcoverage); else if (fcoverage->featureTypes() == itPOLYGON) ok = loadBinaryPolygons(fcoverage); _binaryIsLoaded = ok; if ( ok && extTable.isValid()) { ITable attTbl = fcoverage->attributeTable(); quint32 nrAttrCols = std::min(attTbl->columnCount(),extTable->columnCount()); // quint32 keyIndex = extTable->columnIndex(COVERAGEKEYCOLUMN); for(quint32 rowExt=0; rowExt < extTable->recordCount(); ++rowExt) { if ( rowExt < fcoverage->featureCount()){ vector<QVariant> rec = extTable->record(rowExt); rec.resize(nrAttrCols); // extTable received an extra "Domain" column, which is not there (and will not be there) in attTbl attTbl->record(rowExt,rec); } } } } catch (FeatureCreationError& ) { } if ( ok) _binaryIsLoaded = true; return ok; }
bool FeatureConnector::storeBinaryData(IlwisObject *obj) { FeatureCoverage *fcov = static_cast<FeatureCoverage *>(obj); IlwisTypes featureTypes = fcov->featureTypes(); bool ok = true; ok &= storeBinaryData(fcov, featureTypes & itPOLYGON); ok &= storeBinaryData(fcov, featureTypes & itLINE); ok &= storeBinaryData(fcov, featureTypes & itPOINT); return ok; }