From dc728f6c3939fa12b98ce651e48b08b234674bb5 Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Tue, 29 Jan 2013 01:18:42 +0100 Subject: [PATCH] update calls to new api --- .../interpolation/qgsinterpolator.cpp | 7 +- .../interpolation/qgstininterpolator.cpp | 6 +- .../network/qgslinevectorlayerdirector.cpp | 13 +-- src/analysis/vector/qgsgeometryanalyzer.cpp | 51 ++++++------ src/analysis/vector/qgsoverlayanalyzer.cpp | 19 +++-- src/analysis/vector/qgszonalstatistics.cpp | 1 - src/app/legend/qgslegendlayer.cpp | 4 +- src/app/nodetool/qgsmaptoolnodetool.cpp | 2 +- src/app/nodetool/qgsselectedfeature.cpp | 2 +- src/app/qgsattributedialog.cpp | 2 +- src/app/qgsattributetabledialog.cpp | 9 +- src/app/qgsattributetypedialog.cpp | 8 +- src/app/qgsattributetypeloaddialog.cpp | 10 ++- src/app/qgsfieldcalculator.cpp | 4 +- src/app/qgsgraduatedsymboldialog.cpp | 4 +- src/app/qgsidentifyresults.cpp | 6 +- src/app/qgslabelpropertydialog.cpp | 2 +- src/app/qgsmaptooldeletepart.cpp | 2 +- src/app/qgsmaptooldeletering.cpp | 2 +- src/app/qgsmaptoolfeatureaction.cpp | 4 +- src/app/qgsmaptoolidentify.cpp | 4 +- src/app/qgsmaptoollabel.cpp | 15 ++-- src/app/qgsmaptoolmovefeature.cpp | 4 +- src/app/qgsmaptooloffsetcurve.cpp | 2 +- src/app/qgsmaptoolreshape.cpp | 4 +- src/app/qgsmaptoolrotatefeature.cpp | 6 +- src/app/qgsmaptoolrotatepointsymbols.cpp | 2 +- src/app/qgsmaptoolselectutils.cpp | 4 +- src/app/qgsmaptoolshowhidelabels.cpp | 6 +- src/app/qgsmaptoolsimplify.cpp | 6 +- src/app/qgsmergeattributesdialog.cpp | 2 +- src/core/composer/qgsatlascomposition.cpp | 24 +++--- .../composer/qgscomposerattributetable.cpp | 17 ++-- src/core/qgsfeaturerequest.h | 7 +- src/core/qgsofflineediting.cpp | 16 ++-- src/core/qgsvectorfilewriter.cpp | 23 ++--- src/core/qgsvectorlayereditutils.cpp | 13 ++- src/core/qgsvectorlayerimport.cpp | 10 ++- src/core/qgsvectorlayerjoinbuffer.cpp | 17 ++-- src/core/qgsvectorlayerundocommand.cpp | 60 +++++++------- .../qgsgraduatedsymbolrendererv2.cpp | 5 +- .../qgspointdisplacementrenderer.cpp | 8 +- .../qgsattributetablememorymodel.cpp | 4 +- .../attributetable/qgsattributetablemodel.cpp | 10 +-- src/gui/qgsattributeeditor.cpp | 5 +- src/gui/qgsexpressionbuilderwidget.cpp | 3 +- src/gui/qgsformannotationitem.cpp | 8 +- src/gui/qgshtmlannotationitem.cpp | 6 +- src/gui/qgsmaptip.cpp | 3 +- src/gui/qgssearchquerybuilder.cpp | 9 +- .../qgsrulebasedrendererv2widget.cpp | 8 +- src/mapserver/qgswfsserver.cpp | 83 ++++++++++++++----- src/mapserver/qgswmsserver.cpp | 7 +- .../diagram_overlay/qgsdiagramoverlay.cpp | 8 +- .../evisgenericeventbrowsergui.cpp | 2 +- src/plugins/evis/idtool/eviseventidtool.cpp | 4 +- src/plugins/globe/globe_plugin.cpp | 5 +- src/plugins/heatmap/heatmap.cpp | 4 +- .../spatialquery/qgsreaderfeatures.cpp | 20 ++--- src/plugins/spatialquery/qgsreaderfeatures.h | 1 + .../spatialquery/qgsrubberselectid.cpp | 2 +- src/plugins/spatialquery/qgsspatialquery.cpp | 4 +- .../spatialquery/qgsspatialquerydialog.cpp | 2 +- tests/src/core/testqgscomposerlabel.cpp | 7 +- tests/src/core/testqgsvectorlayer.cpp | 4 +- 65 files changed, 338 insertions(+), 284 deletions(-) diff --git a/src/analysis/interpolation/qgsinterpolator.cpp b/src/analysis/interpolation/qgsinterpolator.cpp index da81c97a2fc..573097db8c4 100644 --- a/src/analysis/interpolation/qgsinterpolator.cpp +++ b/src/analysis/interpolation/qgsinterpolator.cpp @@ -67,13 +67,14 @@ int QgsInterpolator::cacheBaseData() attList.push_back( v_it->interpolationAttribute ); } - vlayer->select( attList ); - QgsFeature theFeature; double attributeValue = 0.0; bool attributeConversionOk = false; - while ( vlayer->nextFeature( theFeature ) ) + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( attList ) ); + + QgsFeature theFeature; + while ( fit.nextFeature( theFeature ) ) { if ( !v_it->zCoordInterpolation ) { diff --git a/src/analysis/interpolation/qgstininterpolator.cpp b/src/analysis/interpolation/qgstininterpolator.cpp index a898e92b2d1..030f326c5bb 100644 --- a/src/analysis/interpolation/qgstininterpolator.cpp +++ b/src/analysis/interpolation/qgstininterpolator.cpp @@ -113,8 +113,10 @@ void QgsTINInterpolator::initialize() { attList.push_back( layerDataIt->interpolationAttribute ); } - layerDataIt->vectorLayer->select( attList ); - while ( layerDataIt->vectorLayer->nextFeature( f ) ) + + QgsFeatureIterator fit = layerDataIt->vectorLayer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( attList ) ); + + while ( fit.nextFeature( f ) ) { if ( mShowProgressDialog ) { diff --git a/src/analysis/network/qgslinevectorlayerdirector.cpp b/src/analysis/network/qgslinevectorlayerdirector.cpp index 5e6cb49e991..bae6fa76b47 100644 --- a/src/analysis/network/qgslinevectorlayerdirector.cpp +++ b/src/analysis/network/qgslinevectorlayerdirector.cpp @@ -158,11 +158,12 @@ void QgsLineVectorLayerDirector::makeGraph( QgsGraphBuilderInterface *builder, c //Graph's points; QVector< QgsPoint > points; + QgsFeatureIterator fit = vl->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ) ); + // begin: tie points to the graph QgsAttributeList la; - vl->select( la ); QgsFeature feature; - while ( vl->nextFeature( feature ) ) + while ( fit.nextFeature( feature ) ) { QgsMultiPolyline mpl; if ( feature.geometry()->wkbType() == QGis::WKBMultiLineString ) @@ -233,7 +234,6 @@ void QgsLineVectorLayerDirector::makeGraph( QgsGraphBuilderInterface *builder, c QVector< QgsPoint >::iterator tmp = std::unique( points.begin(), points.end() ); points.resize( tmp - points.begin() ); - for ( i = 0;i < points.size();++i ) builder->addVertex( i, points[ i ] ); @@ -242,7 +242,8 @@ void QgsLineVectorLayerDirector::makeGraph( QgsGraphBuilderInterface *builder, c qSort( pointLengthMap.begin(), pointLengthMap.end(), TiePointInfoCompare ); - { // fill attribute list 'la' + { + // fill attribute list 'la' QgsAttributeList tmpAttr; if ( mDirectionFieldId != -1 ) { @@ -277,8 +278,8 @@ void QgsLineVectorLayerDirector::makeGraph( QgsGraphBuilderInterface *builder, c } // end fill attribute list 'la' // begin graph construction - vl->select( la ); - while ( vl->nextFeature( feature ) ) + fit = vl->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( la ) ); + while ( fit.nextFeature( feature ) ) { int directionType = mDefaultDirection; diff --git a/src/analysis/vector/qgsgeometryanalyzer.cpp b/src/analysis/vector/qgsgeometryanalyzer.cpp index a878853cbe0..dbe4d01995a 100644 --- a/src/analysis/vector/qgsgeometryanalyzer.cpp +++ b/src/analysis/vector/qgsgeometryanalyzer.cpp @@ -73,7 +73,7 @@ bool QgsGeometryAnalyzer::simplify( QgsVectorLayer* layer, { break; } - if ( !layer->featureAtId( *it, currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -89,8 +89,7 @@ bool QgsGeometryAnalyzer::simplify( QgsVectorLayer* layer, //take all features else { - layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); - + QgsFeatureIterator fit = layer->getFeatures(); int featureCount = layer->featureCount(); if ( p ) @@ -99,7 +98,7 @@ bool QgsGeometryAnalyzer::simplify( QgsVectorLayer* layer, } int processedFeatures = 0; - while ( layer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { if ( p ) { @@ -189,7 +188,7 @@ bool QgsGeometryAnalyzer::centroids( QgsVectorLayer* layer, const QString& shape { break; } - if ( !layer->featureAtId( *it, currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -205,7 +204,7 @@ bool QgsGeometryAnalyzer::centroids( QgsVectorLayer* layer, const QString& shape //take all features else { - layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ) ); int featureCount = layer->featureCount(); if ( p ) @@ -214,7 +213,7 @@ bool QgsGeometryAnalyzer::centroids( QgsVectorLayer* layer, const QString& shape } int processedFeatures = 0; - while ( layer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { if ( p ) { @@ -435,7 +434,7 @@ bool QgsGeometryAnalyzer::convexHull( QgsVectorLayer* layer, const QString& shap return false; } #endif - if ( !layer->featureAtId( *it, currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -444,8 +443,8 @@ bool QgsGeometryAnalyzer::convexHull( QgsVectorLayer* layer, const QString& shap } else { - layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); - while ( layer->nextFeature( currentFeature ) ) + QgsFeatureIterator fit = layer->getFeatures(); + while ( fit.nextFeature( currentFeature ) ) { #if 0 if ( p ) @@ -489,7 +488,7 @@ bool QgsGeometryAnalyzer::convexHull( QgsVectorLayer* layer, const QString& shap { p->setValue( processedFeatures ); } - if ( !layer->featureAtId( jt.value(), currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( jt.value() ) ).nextFeature( currentFeature ) ) { continue; } @@ -535,7 +534,7 @@ bool QgsGeometryAnalyzer::convexHull( QgsVectorLayer* layer, const QString& shap { break; } - if ( !layer->featureAtId( jt.value(), currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( jt.value() ) ).nextFeature( currentFeature ) ) { continue; } @@ -629,7 +628,7 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef QgsFeatureIds::const_iterator it = selection.constBegin(); for ( ; it != selection.constEnd(); ++it ) { - if ( !layer->featureAtId( *it, currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -638,8 +637,8 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef } else { - layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); - while ( layer->nextFeature( currentFeature ) ) + QgsFeatureIterator fit = layer->getFeatures(); + while ( fit.nextFeature( currentFeature ) ) { map.insert( currentFeature.attribute( uniqueIdField ).toString(), currentFeature.id() ); } @@ -674,7 +673,7 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef { p->setValue( processedFeatures ); } - if ( !layer->featureAtId( jt.value(), currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( jt.value() ) ).nextFeature( currentFeature ) ) { continue; } @@ -708,7 +707,7 @@ bool QgsGeometryAnalyzer::dissolve( QgsVectorLayer* layer, const QString& shapef { break; } - if ( !layer->featureAtId( jt.value(), currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( jt.value() ) ).nextFeature( currentFeature ) ) { continue; } @@ -798,7 +797,7 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil { break; } - if ( !layer->featureAtId( *it, currentFeature, true, true ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -814,8 +813,7 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil //take all features else { - layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); - + QgsFeatureIterator fit = layer->getFeatures(); int featureCount = layer->featureCount(); if ( p ) @@ -824,7 +822,7 @@ bool QgsGeometryAnalyzer::buffer( QgsVectorLayer* layer, const QString& shapefil } int processedFeatures = 0; - while ( layer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { if ( p ) { @@ -920,10 +918,9 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* //create line field / id map for line layer QMultiHash< QString, QgsFeatureId > lineLayerIdMap; //1:n possible (e.g. several linear reference geometries for one feature in the event layer) - lineLayer->select( QgsAttributeList() << lineField, - QgsRectangle(), false, false ); + QgsFeatureIterator fit = lineLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( QgsAttributeList() << lineField ) ); QgsFeature fet; - while ( lineLayer->nextFeature( fet ) ) + while ( fit.nextFeature( fet ) ) { lineLayerIdMap.insert( fet.attribute( lineField ).toString(), fet.id() ); } @@ -955,7 +952,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* } //iterate over eventLayer and write new features to output file or layer - eventLayer->select( eventLayer->pendingAllAttributesList(), QgsRectangle(), false, false ); + fit = eventLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) ); QgsGeometry* lrsGeom = 0; QgsFeature lineFeature; double measure1, measure2 = 0.0; @@ -971,7 +968,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* p->show(); } - while ( eventLayer->nextFeature( fet ) ) + while ( fit.nextFeature( fet ) ) { nOutputFeatures = 0; @@ -996,7 +993,7 @@ bool QgsGeometryAnalyzer::eventLayer( QgsVectorLayer* lineLayer, QgsVectorLayer* QList::const_iterator featureIdIt = featureIdList.constBegin(); for ( ; featureIdIt != featureIdList.constEnd(); ++featureIdIt ) { - if ( !lineLayer->featureAtId( *featureIdIt, lineFeature, true, false ) ) + if ( !lineLayer->getFeatures( QgsFeatureRequest().setFilterFid( *featureIdIt ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( lineFeature ) ) { continue; } diff --git a/src/analysis/vector/qgsoverlayanalyzer.cpp b/src/analysis/vector/qgsoverlayanalyzer.cpp index 8f5711751b5..d1d7ced2178 100644 --- a/src/analysis/vector/qgsoverlayanalyzer.cpp +++ b/src/analysis/vector/qgsoverlayanalyzer.cpp @@ -60,7 +60,7 @@ bool QgsOverlayAnalyzer::intersection( QgsVectorLayer* layerA, QgsVectorLayer* l QgsFeatureIds::const_iterator it = selectionB.constBegin(); for ( ; it != selectionB.constEnd(); ++it ) { - if ( !layerB->featureAtId( *it, currentFeature, true, true ) ) + if ( !layerB->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -86,7 +86,7 @@ bool QgsOverlayAnalyzer::intersection( QgsVectorLayer* layerA, QgsVectorLayer* l { break; } - if ( !layerA->featureAtId( *it, currentFeature, true, true ) ) + if ( !layerA->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( currentFeature ) ) { continue; } @@ -102,13 +102,11 @@ bool QgsOverlayAnalyzer::intersection( QgsVectorLayer* layerA, QgsVectorLayer* l //take all features else { - layerB->select( layerB->pendingAllAttributesList(), QgsRectangle(), true, false ); - while ( layerB->nextFeature( currentFeature ) ) + QgsFeatureIterator fit = layerB->getFeatures(); + while ( fit.nextFeature( currentFeature ) ) { index.insertFeature( currentFeature ); } - QgsFeature currentFeature; - layerA->select( layerA->pendingAllAttributesList(), QgsRectangle(), true, false ); int featureCount = layerA->featureCount(); if ( p ) @@ -117,7 +115,10 @@ bool QgsOverlayAnalyzer::intersection( QgsVectorLayer* layerA, QgsVectorLayer* l } int processedFeatures = 0; - while ( layerA->nextFeature( currentFeature ) ) + fit = layerA->getFeatures(); + + QgsFeature currentFeature; + while ( fit.nextFeature( currentFeature ) ) { if ( p ) { @@ -156,7 +157,7 @@ void QgsOverlayAnalyzer::intersectFeature( QgsFeature& f, QgsVectorFileWriter* v QgsFeature outFeature; for ( ; it != intersects.constEnd(); ++it ) { - if ( !vl->featureAtId( *it, overlayFeature, true, true ) ) + if ( !vl->getFeatures( QgsFeatureRequest().setFilterFid( *it ) ).nextFeature( overlayFeature ) ) { continue; } @@ -192,7 +193,7 @@ void QgsOverlayAnalyzer::combineFieldLists( QgsFields& fieldListA, const QgsFiel int count = 0; while ( names.contains( field.name() ) ) { - QString name = QString("%1_%2").arg( field.name() ).arg( count ); + QString name = QString( "%1_%2" ).arg( field.name() ).arg( count ); field = QgsField( name, field.type() ); ++count; } diff --git a/src/analysis/vector/qgszonalstatistics.cpp b/src/analysis/vector/qgszonalstatistics.cpp index bf672831cd5..f5e590f879f 100644 --- a/src/analysis/vector/qgszonalstatistics.cpp +++ b/src/analysis/vector/qgszonalstatistics.cpp @@ -140,7 +140,6 @@ int QgsZonalStatistics::calculateStatistics( QProgressDialog* p ) QgsFeatureRequest request; request.setSubsetOfAttributes( QgsAttributeList() ); QgsFeatureIterator fi = vectorProvider->getFeatures( request ); - //vectorProvider->select( QgsAttributeList(), QgsRectangle(), true, false ); QgsFeature f; double count = 0; double sum = 0; diff --git a/src/app/legend/qgslegendlayer.cpp b/src/app/legend/qgslegendlayer.cpp index 18a516b6d38..1ecee53c89c 100644 --- a/src/app/legend/qgslegendlayer.cpp +++ b/src/app/legend/qgslegendlayer.cpp @@ -687,11 +687,11 @@ void QgsLegendLayer::updateItemListCount( QgsVectorLayer* layer, const QListselect( layer->pendingAllAttributesList(), QgsRectangle(), false, false ); + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) ); QgsFeature f; QgsSymbol* currentSymbol = 0; - while ( layer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { currentSymbol = renderer->symbolForFeature( &f ); if ( currentSymbol ) diff --git a/src/app/nodetool/qgsmaptoolnodetool.cpp b/src/app/nodetool/qgsmaptoolnodetool.cpp index 368555892f0..98f85227258 100644 --- a/src/app/nodetool/qgsmaptoolnodetool.cpp +++ b/src/app/nodetool/qgsmaptoolnodetool.cpp @@ -148,7 +148,7 @@ void QgsMapToolNodeTool::createTopologyRubberBands( QgsVectorLayer* vlayer, cons int tVertexFirst = tVertex; // vertex number to check for cycling QgsFeature topolFeature; - vlayer->featureAtId( resultIt.value().snappedAtGeometry, topolFeature, true, false ); + vlayer->getFeatures( QgsFeatureRequest().setFilterFid( resultIt.value().snappedAtGeometry ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( topolFeature ); QgsGeometry* topolGeometry = topolFeature.geometry(); while ( tVertex != -1 ) // looking for first vertex to rubberband diff --git a/src/app/nodetool/qgsselectedfeature.cpp b/src/app/nodetool/qgsselectedfeature.cpp index ae9d4cf4c98..a5cc1f4c4ca 100644 --- a/src/app/nodetool/qgsselectedfeature.cpp +++ b/src/app/nodetool/qgsselectedfeature.cpp @@ -75,7 +75,7 @@ void QgsSelectedFeature::updateGeometry( QgsGeometry *geom ) if ( !geom ) { QgsFeature f; - mVlayer->featureAtId( mFeatureId, f ); + mVlayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureId ) ).nextFeature( f ); mGeometry = new QgsGeometry( *f.geometry() ); } else diff --git a/src/app/qgsattributedialog.cpp b/src/app/qgsattributedialog.cpp index 18f935af185..e1c123fadb7 100644 --- a/src/app/qgsattributedialog.cpp +++ b/src/app/qgsattributedialog.cpp @@ -261,7 +261,7 @@ QgsAttributeDialog::QgsAttributeDialog( QgsVectorLayer *vl, QgsFeature *thepFeat if ( !mFeature->geometry() && exp.needsGeometry() ) { QgsFeature f; - if ( vl->featureAtId( mFeature->id(), f, true, false ) && f.geometry() ) + if ( vl->getFeatures( QgsFeatureRequest().setFilterFid( mFeature->id() ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) && f.geometry() ) { mFeature->setGeometry( *f.geometry() ); } diff --git a/src/app/qgsattributetabledialog.cpp b/src/app/qgsattributetabledialog.cpp index caa1d2f84ed..de99620f71b 100644 --- a/src/app/qgsattributetabledialog.cpp +++ b/src/app/qgsattributetabledialog.cpp @@ -577,10 +577,13 @@ void QgsAttributeTableDialog::doSearch( QString searchString ) } else { - mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), fetchGeom ); - QgsFeature f; + QgsFeatureRequest r; + if ( !fetchGeom ) + r.setFlags( QgsFeatureRequest::NoGeometry ); + QgsFeatureIterator fit = mLayer->getFeatures( r ); - while ( mLayer->nextFeature( f ) ) + QgsFeature f; + while ( fit.nextFeature( f ) ) { if ( search.evaluate( &f ).toInt() != 0 ) mSelectedFeatures << f.id(); diff --git a/src/app/qgsattributetypedialog.cpp b/src/app/qgsattributetypedialog.cpp index 973d0622305..c3f86023082 100644 --- a/src/app/qgsattributetypedialog.cpp +++ b/src/app/qgsattributetypedialog.cpp @@ -310,9 +310,11 @@ void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editT setWindowTitle( defaultWindowTitle() + " \"" + mLayer->pendingFields()[index].name() + "\"" ); QgsAttributeList attributeList = QgsAttributeList(); attributeList.append( index ); - mLayer->select( attributeList, QgsRectangle(), false ); + + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributeList ) ); QgsFeature f; + QString text; //calculate min and max for range for this field if ( mLayer->pendingFields()[index].type() == QVariant::Int ) @@ -321,7 +323,7 @@ void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editT rangeWidget->addItems( QStringList() << tr( "Editable" ) << tr( "Slider" ) << tr( "Dial" ) ); int min = INT_MIN; int max = INT_MAX; - while ( mLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QVariant val = f.attribute( index ); if ( val.isValid() && !val.isNull() ) @@ -342,7 +344,7 @@ void QgsAttributeTypeDialog::setIndex( int index, QgsVectorLayer::EditType editT rangeWidget->clear(); rangeWidget->addItems( QStringList() << tr( "Editable" ) << tr( "Slider" ) ); - while ( mLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QVariant val = f.attribute( index ); if ( val.isValid() && !val.isNull() ) diff --git a/src/app/qgsattributetypeloaddialog.cpp b/src/app/qgsattributetypeloaddialog.cpp index 0094eac32e0..37b7922c04a 100644 --- a/src/app/qgsattributetypeloaddialog.cpp +++ b/src/app/qgsattributetypeloaddialog.cpp @@ -133,11 +133,12 @@ void QgsAttributeTypeLoadDialog::createPreview( int fieldIndex, bool full ) QgsAttributeList attributeList = QgsAttributeList(); attributeList.append( idx ); attributeList.append( idx2 ); - vLayer->select( attributeList, QgsRectangle(), false ); + + QgsFeatureIterator fit = vLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributeList ) ); QgsFeature f; QMap valueMap; - while ( vLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QVariant val1 = f.attribute( idx ); QVariant val2 = f.attribute( idx2 ); @@ -183,10 +184,11 @@ void QgsAttributeTypeLoadDialog::loadDataToValueMap() QgsAttributeList attributeList = QgsAttributeList(); attributeList.append( idx ); attributeList.append( idx2 ); - vLayer->select( attributeList, QgsRectangle(), false ); + + QgsFeatureIterator fit = vLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributeList ) ); QgsFeature f; - while ( vLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QVariant val = f.attribute( idx ); if ( val.isValid() && !val.isNull() && !val.toString().isEmpty() ) diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp index 90399a0c162..b8ae0fd69fb 100644 --- a/src/app/qgsfieldcalculator.cpp +++ b/src/app/qgsfieldcalculator.cpp @@ -161,8 +161,8 @@ void QgsFieldCalculator::accept() bool useGeometry = exp.needsGeometry(); int rownum = 1; - mVectorLayer->select( mVectorLayer->pendingAllAttributesList(), QgsRectangle(), useGeometry, false ); - while ( mVectorLayer->nextFeature( feature ) ) + QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFlags( useGeometry ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ); + while ( fit.nextFeature( feature ) ) { if ( onlySelected ) { diff --git a/src/app/qgsgraduatedsymboldialog.cpp b/src/app/qgsgraduatedsymboldialog.cpp index de908367114..50fbc8222bf 100644 --- a/src/app/qgsgraduatedsymboldialog.cpp +++ b/src/app/qgsgraduatedsymboldialog.cpp @@ -500,8 +500,8 @@ int QgsGraduatedSymbolDialog::quantilesFromVectorLayer( std::list& resul double currentValue; int index = 0; - mVectorLayer->select( attList, QgsRectangle(), false ); - while ( mVectorLayer->nextFeature( currentFeature ) ) + QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attList ) ); + while ( fit.nextFeature( currentFeature ) ) { currentValue = currentFeature.attribute( attributeIndex ).toDouble(); attributeValues[index] = currentValue; diff --git a/src/app/qgsidentifyresults.cpp b/src/app/qgsidentifyresults.cpp index cc0f4b08135..9240a99aac8 100644 --- a/src/app/qgsidentifyresults.cpp +++ b/src/app/qgsidentifyresults.cpp @@ -871,7 +871,7 @@ void QgsIdentifyResults::highlightFeature( QTreeWidgetItem *item ) QgsFeatureId fid = STRING_TO_FID( featItem->data( 0, Qt::UserRole ) ); QgsFeature feat; - if ( !layer->featureAtId( fid, feat, true, false ) ) + if ( !layer->getFeatures( QgsFeatureRequest().setFilterFid( fid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( feat ) ) { return; } @@ -906,7 +906,7 @@ void QgsIdentifyResults::zoomToFeature() int fid = STRING_TO_FID( featItem->data( 0, Qt::UserRole ) ); QgsFeature feat; - if ( ! layer->featureAtId( fid, feat, true, false ) ) + if ( ! layer->getFeatures( QgsFeatureRequest().setFilterFid( fid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( feat ) ) { return; } @@ -945,7 +945,7 @@ void QgsIdentifyResults::featureForm() int idx = featItem->data( 0, Qt::UserRole + 1 ).toInt(); QgsFeature f; - if ( !vlayer->featureAtId( fid, f ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( fid ) ).nextFeature( f ) ) return; QgsFeatureAction action( tr( "Attribute changes" ), f, vlayer, idx, -1, this ); diff --git a/src/app/qgslabelpropertydialog.cpp b/src/app/qgslabelpropertydialog.cpp index 98e95479cbe..e370a6e61a5 100644 --- a/src/app/qgslabelpropertydialog.cpp +++ b/src/app/qgslabelpropertydialog.cpp @@ -50,7 +50,7 @@ void QgsLabelPropertyDialog::init( const QString& layerId, int featureId, const } QgsFeature f; - if ( !vlayer->featureAtId( featureId, f, false, true ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { return; } diff --git a/src/app/qgsmaptooldeletepart.cpp b/src/app/qgsmaptooldeletepart.cpp index f1b5df03ad8..47fe4772e4a 100644 --- a/src/app/qgsmaptooldeletepart.cpp +++ b/src/app/qgsmaptooldeletepart.cpp @@ -94,7 +94,7 @@ void QgsMapToolDeletePart::canvasReleaseEvent( QMouseEvent *e ) void QgsMapToolDeletePart::deletePart( QgsFeatureId fId, int beforeVertexNr, QgsVectorLayer* vlayer ) { QgsFeature f; - vlayer->featureAtId( fId, f ); + vlayer->getFeatures( QgsFeatureRequest().setFilterFid( fId ) ).nextFeature( f ); // find out the part number QgsGeometry* g = f.geometry(); diff --git a/src/app/qgsmaptooldeletering.cpp b/src/app/qgsmaptooldeletering.cpp index fc8ecf735cf..189e125095c 100644 --- a/src/app/qgsmaptooldeletering.cpp +++ b/src/app/qgsmaptooldeletering.cpp @@ -94,7 +94,7 @@ void QgsMapToolDeleteRing::canvasReleaseEvent( QMouseEvent *e ) void QgsMapToolDeleteRing::deleteRing( QgsFeatureId fId, int beforeVertexNr, QgsVectorLayer* vlayer ) { QgsFeature f; - vlayer->featureAtId( fId, f ); + vlayer->getFeatures( QgsFeatureRequest().setFilterFid( fId ) ).nextFeature( f ); QgsGeometry* g = f.geometry(); QGis::WkbType wkbtype = g->wkbType(); diff --git a/src/app/qgsmaptoolfeatureaction.cpp b/src/app/qgsmaptoolfeatureaction.cpp index e33e2caa196..9475aed8a69 100644 --- a/src/app/qgsmaptoolfeatureaction.cpp +++ b/src/app/qgsmaptoolfeatureaction.cpp @@ -132,9 +132,9 @@ bool QgsMapToolFeatureAction::doAction( QgsVectorLayer *layer, int x, int y ) r = toLayerCoordinates( layer, r ); - layer->select( layer->pendingAllAttributesList(), r, true, true ); + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFilterRect( r ).setFlags( QgsFeatureRequest::ExactIntersect ) ); QgsFeature f; - while ( layer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) featList << QgsFeature( f ); } catch ( QgsCsException & cse ) diff --git a/src/app/qgsmaptoolidentify.cpp b/src/app/qgsmaptoolidentify.cpp index 19733063657..c723d45bbe6 100644 --- a/src/app/qgsmaptoolidentify.cpp +++ b/src/app/qgsmaptoolidentify.cpp @@ -240,9 +240,9 @@ bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, int x, int r = toLayerCoordinates( layer, r ); - layer->select( layer->pendingAllAttributesList(), r, true, true ); + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFilterRect( r ).setFlags( QgsFeatureRequest::ExactIntersect ) ); QgsFeature f; - while ( layer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) featureList << QgsFeature( f ); } catch ( QgsCsException & cse ) diff --git a/src/app/qgsmaptoollabel.cpp b/src/app/qgsmaptoollabel.cpp index 230eb4057d4..f6c8f6b92ce 100644 --- a/src/app/qgsmaptoollabel.cpp +++ b/src/app/qgsmaptoollabel.cpp @@ -178,7 +178,7 @@ QString QgsMapToolLabel::currentLabelText( int trunc ) { int labelFieldId = vlayer->fieldNameIndex( labelField ); QgsFeature f; - if ( vlayer->featureAtId( mCurrentLabelPos.featureId, f, false, true ) ) + if ( vlayer->getFeatures( QgsFeatureRequest().setFilterFid( mCurrentLabelPos.featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { QString labelText = f.attribute( labelFieldId ).toString(); if ( trunc > 0 && labelText.length() > trunc ) @@ -231,7 +231,10 @@ bool QgsMapToolLabel::currentFeature( QgsFeature& f, bool fetchGeom ) { return false; } - return vlayer->featureAtId( mCurrentLabelPos.featureId, f, fetchGeom, true ); + return vlayer->getFeatures( QgsFeatureRequest() + .setFilterFid( mCurrentLabelPos.featureId ) + .setFlags( fetchGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) + ).nextFeature( f ); } QFont QgsMapToolLabel::labelFontCurrentFeature() @@ -247,7 +250,7 @@ QFont QgsMapToolLabel::labelFontCurrentFeature() font = layerSettings.textFont; QgsFeature f; - if ( vlayer->featureAtId( mCurrentLabelPos.featureId, f, false, true ) ) + if ( vlayer->getFeatures( QgsFeatureRequest().setFilterFid( mCurrentLabelPos.featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { const QgsAttributes& attributes = f.attributes(); QMap< QgsPalLayerSettings::DataDefinedProperties, int > ddProperties = layerSettings.dataDefinedProperties; @@ -440,7 +443,7 @@ bool QgsMapToolLabel::dataDefinedPosition( QgsVectorLayer* vlayer, int featureId } QgsFeature f; - if ( !vlayer->featureAtId( featureId, f, false, true ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { return false; } @@ -490,7 +493,7 @@ bool QgsMapToolLabel::dataDefinedRotation( QgsVectorLayer* vlayer, int featureId } QgsFeature f; - if ( !vlayer->featureAtId( featureId, f, false, true ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { return false; } @@ -525,7 +528,7 @@ bool QgsMapToolLabel::dataDefinedShowHide( QgsVectorLayer* vlayer, int featureId } QgsFeature f; - if ( !vlayer->featureAtId( featureId, f, false, true ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { return false; } diff --git a/src/app/qgsmaptoolmovefeature.cpp b/src/app/qgsmaptoolmovefeature.cpp index b3b0435dccf..fc89b99aee5 100644 --- a/src/app/qgsmaptoolmovefeature.cpp +++ b/src/app/qgsmaptoolmovefeature.cpp @@ -75,7 +75,7 @@ void QgsMapToolMoveFeature::canvasPressEvent( QMouseEvent * e ) if ( vlayer->selectedFeatureCount() == 0 ) { - vlayer->select( QgsAttributeList(), selectRect, true ); + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( selectRect ).setSubsetOfAttributes( QgsAttributeList() ) ); //find the closest feature QgsGeometry* pointGeometry = QgsGeometry::fromPoint( layerCoords ); @@ -88,7 +88,7 @@ void QgsMapToolMoveFeature::canvasPressEvent( QMouseEvent * e ) QgsFeature cf; QgsFeature f; - while ( vlayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { if ( f.geometry() ) { diff --git a/src/app/qgsmaptooloffsetcurve.cpp b/src/app/qgsmaptooloffsetcurve.cpp index 1933b74ca59..14032869c57 100644 --- a/src/app/qgsmaptooloffsetcurve.cpp +++ b/src/app/qgsmaptooloffsetcurve.cpp @@ -71,7 +71,7 @@ void QgsMapToolOffsetCurve::canvasPressEvent( QMouseEvent* e ) mSourceLayerId = snapResult.layer->id(); QgsVectorLayer* vl = dynamic_cast( QgsMapLayerRegistry::instance()->mapLayer( mSourceLayerId ) ); - if ( vl && vl->featureAtId( snapResult.snappedAtGeometry, fet ) ) + if ( vl && vl->getFeatures( QgsFeatureRequest().setFilterFid( snapResult.snappedAtGeometry ) ).nextFeature( fet ) ) { mForceCopy = ( e->modifiers() & Qt::ControlModifier ); //no geometry modification if ctrl is pressed mOriginalGeometry = createOriginGeometry( vl, snapResult, fet ); diff --git a/src/app/qgsmaptoolreshape.cpp b/src/app/qgsmaptoolreshape.cpp index 4bd05963e80..505fd3856c1 100644 --- a/src/app/qgsmaptoolreshape.cpp +++ b/src/app/qgsmaptoolreshape.cpp @@ -83,13 +83,13 @@ void QgsMapToolReshape::canvasReleaseEvent( QMouseEvent * e ) } //query all the features that intersect bounding box of capture line - vlayer->select( QgsAttributeList(), bbox, true, false ); + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( bbox ).setSubsetOfAttributes( QgsAttributeList() ) ); QgsFeature f; int reshapeReturn; bool reshapeDone = false; vlayer->beginEditCommand( tr( "Reshape" ) ); - while ( vlayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { //query geometry //call geometry->reshape(mCaptureList) diff --git a/src/app/qgsmaptoolrotatefeature.cpp b/src/app/qgsmaptoolrotatefeature.cpp index 8c908eb4882..fb42202bfba 100644 --- a/src/app/qgsmaptoolrotatefeature.cpp +++ b/src/app/qgsmaptoolrotatefeature.cpp @@ -106,7 +106,7 @@ void QgsMapToolRotateFeature::canvasPressEvent( QMouseEvent * e ) if ( vlayer->selectedFeatureCount() == 0 ) { - vlayer->select( QgsAttributeList(), selectRect, true ); + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( selectRect ).setSubsetOfAttributes( QgsAttributeList() ) ); //find the closest feature QgsGeometry* pointGeometry = QgsGeometry::fromPoint( layerCoords ); @@ -119,7 +119,7 @@ void QgsMapToolRotateFeature::canvasPressEvent( QMouseEvent * e ) QgsFeature cf; QgsFeature f; - while ( vlayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { if ( f.geometry() ) { @@ -215,7 +215,7 @@ void QgsMapToolRotateFeature::canvasReleaseEvent( QMouseEvent * e ) foreach ( QgsFeatureId id, mRotatedFeatures ) { QgsFeature feat; - vlayer->featureAtId( id, feat ); + vlayer->getFeatures( QgsFeatureRequest().setFilterFid( id ) ).nextFeature( feat ); QgsGeometry* geom = feat.geometry(); i = start; diff --git a/src/app/qgsmaptoolrotatepointsymbols.cpp b/src/app/qgsmaptoolrotatepointsymbols.cpp index f1b1a1934e4..2ce8f01ba8c 100644 --- a/src/app/qgsmaptoolrotatepointsymbols.cpp +++ b/src/app/qgsmaptoolrotatepointsymbols.cpp @@ -120,7 +120,7 @@ void QgsMapToolRotatePointSymbols::canvasPressEvent( QMouseEvent *e ) //find out initial arrow direction QgsFeature pointFeature; - if ( !mActiveLayer->featureAtId( mFeatureNumber, pointFeature, false, true ) ) + if ( !mActiveLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setFilterFid( mFeatureNumber ) ).nextFeature( pointFeature ) ) { return; } diff --git a/src/app/qgsmaptoolselectutils.cpp b/src/app/qgsmaptoolselectutils.cpp index 283226ab73a..d444905ac2c 100644 --- a/src/app/qgsmaptoolselectutils.cpp +++ b/src/app/qgsmaptoolselectutils.cpp @@ -131,14 +131,14 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas, QgsDebugMsg( "doContains: " + QString( doContains ? "T" : "F" ) ); QgsDebugMsg( "doDifference: " + QString( doDifference ? "T" : "F" ) ); - vlayer->select( QgsAttributeList(), selectGeomTrans.boundingBox(), true, true ); + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( selectGeomTrans.boundingBox() ).setFlags( QgsFeatureRequest::ExactIntersect ).setSubsetOfAttributes( QgsAttributeList() ) ); QgsFeatureIds newSelectedFeatures; QgsFeature f; QgsFeatureId closestFeatureId = 0; bool foundSingleFeature = false; double closestFeatureDist = std::numeric_limits::max(); - while ( vlayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QgsGeometry* g = f.geometry(); if ( doContains ) diff --git a/src/app/qgsmaptoolshowhidelabels.cpp b/src/app/qgsmaptoolshowhidelabels.cpp index e106f7e883e..055822446b8 100644 --- a/src/app/qgsmaptoolshowhidelabels.cpp +++ b/src/app/qgsmaptoolshowhidelabels.cpp @@ -210,10 +210,10 @@ bool QgsMapToolShowHideLabels::selectedFeatures( QgsVectorLayer* vlayer, QgsDebugMsg( "Selection layer: " + vlayer->name() ); QgsDebugMsg( "Selection polygon: " + selectGeomTrans.exportToWkt() ); - vlayer->select( QgsAttributeList(), selectGeomTrans.boundingBox(), false, true ); + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( selectGeomTrans.boundingBox() ).setFlags( QgsFeatureRequest::NoGeometry | QgsFeatureRequest::ExactIntersect ).setSubsetOfAttributes( QgsAttributeList() ) ); QgsFeature f; - while ( vlayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QgsGeometry* g = f.geometry(); @@ -282,7 +282,7 @@ bool QgsMapToolShowHideLabels::showHideLabel( QgsVectorLayer* vlayer, // check if attribute value is already the same QgsFeature f; - if ( !vlayer->featureAtId( fid, f, false, true ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterFid( fid ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { return false; } diff --git a/src/app/qgsmaptoolsimplify.cpp b/src/app/qgsmaptoolsimplify.cpp index d16c342bbf4..6c9a2ebcd12 100644 --- a/src/app/qgsmaptoolsimplify.cpp +++ b/src/app/qgsmaptoolsimplify.cpp @@ -263,16 +263,16 @@ void QgsMapToolSimplify::canvasPressEvent( QMouseEvent * e ) double r = QgsTolerance::vertexSearchRadius( vlayer, mCanvas->mapRenderer() ); QgsRectangle selectRect = QgsRectangle( layerCoords.x() - r, layerCoords.y() - r, layerCoords.x() + r, layerCoords.y() + r ); - vlayer->select( QgsAttributeList(), selectRect, true ); + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( selectRect ).setSubsetOfAttributes( QgsAttributeList() ) ); QgsGeometry* geometry = QgsGeometry::fromPoint( layerCoords ); double minDistance = DBL_MAX; double currentDistance; - QgsFeature f; mSelectedFeature.setValid( false ); - while ( vlayer->nextFeature( f ) ) + QgsFeature f; + while ( fit.nextFeature( f ) ) { currentDistance = geometry->distance( *( f.geometry() ) ); if ( currentDistance < minDistance ) diff --git a/src/app/qgsmergeattributesdialog.cpp b/src/app/qgsmergeattributesdialog.cpp index 4f69fe7a1e5..effc1584c4d 100644 --- a/src/app/qgsmergeattributesdialog.cpp +++ b/src/app/qgsmergeattributesdialog.cpp @@ -551,7 +551,7 @@ void QgsMergeAttributesDialog::createRubberBandForFeature( int featureId ) mSelectionRubberBand = new QgsRubberBand( mMapCanvas, mVectorLayer->geometryType() == QGis::Polygon ); mSelectionRubberBand->setColor( QColor( 255, 0, 0 ) ); QgsFeature featureToSelect; - mVectorLayer->featureAtId( featureId, featureToSelect, true, false ); + mVectorLayer->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( featureToSelect ); mSelectionRubberBand->setToGeometry( featureToSelect.geometry(), mVectorLayer ); } diff --git a/src/core/composer/qgsatlascomposition.cpp b/src/core/composer/qgsatlascomposition.cpp index eb518fdb86f..858d04ef109 100644 --- a/src/core/composer/qgsatlascomposition.cpp +++ b/src/core/composer/qgsatlascomposition.cpp @@ -49,7 +49,7 @@ void QgsAtlasComposition::setCoverageLayer( QgsVectorLayer* layer ) mCoverageLayer = layer; // update the number of features - QgsExpression::setSpecialColumn( "$numfeatures", QVariant( (int)mFeatureIds.size() ) ); + QgsExpression::setSpecialColumn( "$numfeatures", QVariant(( int )mFeatureIds.size() ) ); } void QgsAtlasComposition::beginRender() @@ -82,13 +82,13 @@ void QgsAtlasComposition::beginRender() } // select all features with all attributes - mCoverageLayer->select( mCoverageLayer->pendingAllAttributesList() ); + QgsFeatureIterator fit = mCoverageLayer->getFeatures(); // We cannot use nextFeature() directly since the feature pointer is rewinded by the rendering process // We thus store the feature ids for future extraction QgsFeature feat; mFeatureIds.clear(); - while ( mCoverageLayer->nextFeature( feat ) ) + while ( fit.nextFeature( feat ) ) { mFeatureIds.push_back( feat.id() ); } @@ -153,7 +153,7 @@ void QgsAtlasComposition::prepareForFeature( size_t featureI ) } // retrieve the next feature, based on its id - mCoverageLayer->featureAtId( mFeatureIds[ featureI ], mCurrentFeature, /* fetchGeometry = */ true, /* fetchAttributes = */ true ); + mCoverageLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureIds[ featureI ] ) ).nextFeature( mCurrentFeature ); if ( mFilenamePattern.size() > 0 ) { @@ -213,18 +213,18 @@ void QgsAtlasComposition::prepareForFeature( size_t featureI ) // geometry height is too big if ( geom_ratio < map_ratio ) { - // extent the bbox's width - double adj_width = ( map_ratio * geom_rect.height() - geom_rect.width() ) / 2.0; - xa1 -= adj_width; - xa2 += adj_width; + // extent the bbox's width + double adj_width = ( map_ratio * geom_rect.height() - geom_rect.width() ) / 2.0; + xa1 -= adj_width; + xa2 += adj_width; } // geometry width is too big else if ( geom_ratio > map_ratio ) { - // extent the bbox's height - double adj_height = (geom_rect.width() / map_ratio - geom_rect.height() ) / 2.0; - ya1 -= adj_height; - ya2 += adj_height; + // extent the bbox's height + double adj_height = ( geom_rect.width() / map_ratio - geom_rect.height() ) / 2.0; + ya1 -= adj_height; + ya2 += adj_height; } new_extent = QgsRectangle( xa1, ya1, xa2, ya2 ); diff --git a/src/core/composer/qgscomposerattributetable.cpp b/src/core/composer/qgscomposerattributetable.cpp index 0e7ec6355ee..ad56e8eca55 100644 --- a/src/core/composer/qgscomposerattributetable.cpp +++ b/src/core/composer/qgscomposerattributetable.cpp @@ -145,17 +145,16 @@ bool QgsComposerAttributeTable::getFeatureAttributes( QList& attr } } - if ( mDisplayAttributes.size() < 1 ) - { - mVectorLayer->select( mVectorLayer->pendingAllAttributesList(), selectionRect, mShowOnlyVisibleFeatures, mShowOnlyVisibleFeatures ); - } - else - { - mVectorLayer->select( mDisplayAttributes.toList(), selectionRect, mShowOnlyVisibleFeatures, mShowOnlyVisibleFeatures ); - } + QgsFeatureRequest req; + req.setFilterRect( selectionRect ); + req.setFlags( mShowOnlyVisibleFeatures ? QgsFeatureRequest::ExactIntersect : QgsFeatureRequest::NoGeometry ); + if ( mDisplayAttributes.size() >= 0 ) + req.setSubsetOfAttributes( mDisplayAttributes.toList() ); + QgsFeature f; int counter = 0; - while ( mVectorLayer->nextFeature( f ) && counter < mMaximumNumberOfFeatures ) + QgsFeatureIterator fit = mVectorLayer->getFeatures( req ); + while ( fit.nextFeature( f ) && counter < mMaximumNumberOfFeatures ) { attributes.push_back( f.attributes() ); ++counter; diff --git a/src/core/qgsfeaturerequest.h b/src/core/qgsfeaturerequest.h index c70af29d6bc..0516b8ddde2 100644 --- a/src/core/qgsfeaturerequest.h +++ b/src/core/qgsfeaturerequest.h @@ -57,9 +57,10 @@ class CORE_EXPORT QgsFeatureRequest public: enum Flag { - NoGeometry = 0x01, //!< Do not fetch geometry - SubsetOfAttributes = 0x02, //!< Fetch only a subset of attributes (setSubsetOfAttributes sets this flag) - ExactIntersect = 0x04 //!< Use exact geometry intersection (slower) instead of bounding boxes + NoFlags = 0, + NoGeometry = 1, //!< Do not fetch geometry + SubsetOfAttributes = 2, //!< Fetch only a subset of attributes (setSubsetOfAttributes sets this flag) + ExactIntersect = 4 //!< Use exact geometry intersection (slower) instead of bounding boxes }; Q_DECLARE_FLAGS( Flags, Flag ) diff --git a/src/core/qgsofflineediting.cpp b/src/core/qgsofflineediting.cpp index 81c8cd10ca7..282665c029f 100644 --- a/src/core/qgsofflineediting.cpp +++ b/src/core/qgsofflineediting.cpp @@ -509,13 +509,13 @@ void QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlite3* db, con // NOTE: force feature recount for PostGIS layer, else only visible features are counted, before iterating over all features (WORKAROUND) layer->setSubsetString( "" ); - layer->select( layer->pendingAllAttributesList(), QgsRectangle(), true, false ); + QgsFeatureIterator fit = layer->getFeatures(); emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->featureCount() ); int featureCount = 1; QList remoteFeatureIds; - while ( layer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { remoteFeatureIds << f.id(); @@ -542,8 +542,9 @@ void QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlite3* db, con // update feature id lookup int layerId = getOrCreateLayerId( db, newLayer->id() ); QList offlineFeatureIds; - newLayer->select( QgsAttributeList(), QgsRectangle(), false, false ); - while ( newLayer->nextFeature( f ) ) + + QgsFeatureIterator fit = newLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( QgsAttributeList() ) ); + while ( fit.nextFeature( f ) ) { offlineFeatureIds << f.id(); } @@ -617,7 +618,7 @@ void QgsOfflineEditing::applyFeaturesAdded( QgsVectorLayer* offlineLayer, QgsVec for ( int i = 0; i < newFeatureIds.size(); i++ ) { QgsFeature feature; - if ( offlineLayer->featureAtId( newFeatureIds.at( i ), feature, true, true ) ) + if ( offlineLayer->getFeatures( QgsFeatureRequest().setFilterFid( newFeatureIds.at( i ) ) ).nextFeature( feature ) ) { features << feature; } @@ -709,12 +710,13 @@ void QgsOfflineEditing::updateFidLookup( QgsVectorLayer* remoteLayer, sqlite3* d // NOTE: use QMap for sorted fids QMap < QgsFeatureId, bool /*dummy*/ > newRemoteFids; QgsFeature f; - remoteLayer->select( QgsAttributeList(), QgsRectangle(), false, false ); + + QgsFeatureIterator fit = remoteLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( QgsAttributeList() ) ); emit progressModeSet( QgsOfflineEditing::ProcessFeatures, remoteLayer->featureCount() ); int i = 1; - while ( remoteLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { if ( offlineFid( db, layerId, f.id() ) == -1 ) { diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp index 595f1b2a4ae..56facb6bfba 100644 --- a/src/core/qgsvectorfilewriter.cpp +++ b/src/core/qgsvectorfilewriter.cpp @@ -116,14 +116,13 @@ QgsVectorFileWriter::QgsVectorFileWriter( #if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM < 1700 // check for unique fieldnames QSet fieldNames; - QgsFieldMap::const_iterator fldIt; - for ( fldIt = fields.begin(); fldIt != fields.end(); ++fldIt ) + for ( int i = 0; i < fields.count(); ++i ) { - QString name = fldIt.value().name().left( 10 ); + QString name = fields[i].name().left( 10 ); if ( fieldNames.contains( name ) ) { mErrorMessage = QObject::tr( "trimming attribute name '%1' to ten significant characters produces duplicate column name." ) - .arg( fldIt.value().name() ); + .arg( fields[i].name() ); mError = ErrAttributeCreationFailed; return; } @@ -643,11 +642,6 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, errorMessage->clear(); } - QgsAttributeList allAttr = skipAttributeCreation ? QgsAttributeList() : layer->pendingAllAttributesList(); - QgsFeature fet; - - layer->select( allAttr, QgsRectangle(), layer->wkbType() != QGis::WKBNoGeometry ); - const QgsFeatureIds& ids = layer->selectedFeaturesIds(); // Create our transform @@ -664,8 +658,17 @@ QgsVectorFileWriter::writeAsVectorFormat( QgsVectorLayer* layer, int n = 0, errors = 0; + QgsFeatureRequest req; + if ( layer->wkbType() == QGis::WKBNoGeometry ) + req.setFlags( QgsFeatureRequest::NoGeometry ); + if ( skipAttributeCreation ) + req.setSubsetOfAttributes( QgsAttributeList() ); + + QgsFeatureIterator fit = layer->getFeatures( req ); + // write all features - while ( layer->nextFeature( fet ) ) + QgsFeature fet; + while ( fit.nextFeature( fet ) ) { if ( onlySelected && !ids.contains( fet.id() ) ) continue; diff --git a/src/core/qgsvectorlayereditutils.cpp b/src/core/qgsvectorlayereditutils.cpp index 855151eb6a2..5f9d832f906 100644 --- a/src/core/qgsvectorlayereditutils.cpp +++ b/src/core/qgsvectorlayereditutils.cpp @@ -26,7 +26,6 @@ QgsVectorLayerEditUtils::QgsVectorLayerEditUtils( QgsVectorLayer* layer ) { } - bool QgsVectorLayerEditUtils::insertVertex( double x, double y, QgsFeatureId atFeatureId, int beforeVertex ) { if ( !L->hasGeometryType() ) @@ -95,10 +94,10 @@ int QgsVectorLayerEditUtils::addRing( const QList& ring ) return 3; //ring not valid } - L->select( QgsAttributeList(), bBox, true, true ); + QgsFeatureIterator fit = L->getFeatures( QgsFeatureRequest().setFilterRect( bBox ).setFlags( QgsFeatureRequest::ExactIntersect ) ); QgsFeature f; - while ( L->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { addRingReturnCode = f.geometry()->addRing( ring ); if ( addRingReturnCode == 0 ) @@ -124,7 +123,7 @@ int QgsVectorLayerEditUtils::addPart( const QList &points, QgsFeatureI { // it's not in cache: let's fetch it from layer QgsFeature f; - if ( !L->featureAtId( featureId, f, true, false ) || !f.geometry() ) + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.geometry() ) return 6; //geometry not found geometry = *f.geometry(); @@ -150,7 +149,7 @@ int QgsVectorLayerEditUtils::translateFeature( QgsFeatureId featureId, double dx { // it's not in cache: let's fetch it from layer QgsFeature f; - if ( !L->featureAtId( featureId, f, true, false ) || !f.geometry() ) + if ( !L->getFeatures( QgsFeatureRequest().setFilterFid( featureId ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) || !f.geometry() ) return 1; //geometry not found geometry = *f.geometry(); @@ -215,10 +214,10 @@ int QgsVectorLayerEditUtils::splitFeatures( const QList& splitLine, bo } } - L->select( L->pendingAllAttributesList(), bBox, true, true ); + QgsFeatureIterator fit = L->getFeatures( QgsFeatureRequest().setFilterRect( bBox ).setFlags( QgsFeatureRequest::ExactIntersect ) ); QgsFeature f; - while ( L->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) featureList << QgsFeature( f ); } diff --git a/src/core/qgsvectorlayerimport.cpp b/src/core/qgsvectorlayerimport.cpp index 974fb54f0cf..18add1f1213 100644 --- a/src/core/qgsvectorlayerimport.cpp +++ b/src/core/qgsvectorlayerimport.cpp @@ -293,7 +293,13 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer, QgsAttributeList allAttr = skipAttributeCreation ? QgsAttributeList() : layer->pendingAllAttributesList(); QgsFeature fet; - layer->select( allAttr, QgsRectangle(), wkbType != QGis::WKBNoGeometry ); + QgsFeatureRequest req; + if ( wkbType == QGis::WKBNoGeometry ) + req.setFlags( QgsFeatureRequest::NoGeometry ); + if ( skipAttributeCreation ) + req.setSubsetOfAttributes( QgsAttributeList() ); + + QgsFeatureIterator fit = layer->getFeatures( req ); const QgsFeatureIds& ids = layer->selectedFeaturesIds(); @@ -322,7 +328,7 @@ QgsVectorLayerImport::importLayer( QgsVectorLayer* layer, } // write all features - while ( layer->nextFeature( fet ) ) + while ( fit.nextFeature( fet ) ) { if ( progress && progress->wasCanceled() ) { diff --git a/src/core/qgsvectorlayerjoinbuffer.cpp b/src/core/qgsvectorlayerjoinbuffer.cpp index 04eea7df348..d8b8c10a683 100644 --- a/src/core/qgsvectorlayerjoinbuffer.cpp +++ b/src/core/qgsvectorlayerjoinbuffer.cpp @@ -63,12 +63,13 @@ void QgsVectorLayerJoinBuffer::cacheJoinLayer( QgsVectorJoinInfo& joinInfo ) QgsVectorLayer* cacheLayer = dynamic_cast( QgsMapLayerRegistry::instance()->mapLayer( joinInfo.joinLayerId ) ); if ( cacheLayer ) { - int joinFieldIndex = cacheLayer->pendingFields().indexFromName(joinInfo.joinFieldName); + int joinFieldIndex = cacheLayer->pendingFields().indexFromName( joinInfo.joinFieldName ); joinInfo.cachedAttributes.clear(); - cacheLayer->select( cacheLayer->pendingAllAttributesList(), QgsRectangle(), false, false ); + + QgsFeatureIterator fit = cacheLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) ); QgsFeature f; - while ( cacheLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { const QgsAttributes& attrs = f.attributes(); joinInfo.cachedAttributes.insert( attrs[joinFieldIndex].toString(), attrs ); @@ -87,10 +88,10 @@ void QgsVectorLayerJoinBuffer::updateFields( QgsFields& fields ) continue; } - joinIt->tmpTargetField = fields.indexFromName(joinIt->targetFieldName); + joinIt->tmpTargetField = fields.indexFromName( joinIt->targetFieldName ); const QgsFields& joinFields = joinLayer->pendingFields(); - joinIt->tmpJoinField = joinFields.indexFromName(joinIt->joinFieldName); + joinIt->tmpJoinField = joinFields.indexFromName( joinIt->joinFieldName ); for ( int idx = 0; idx < joinFields.count(); ++idx ) { @@ -99,7 +100,7 @@ void QgsVectorLayerJoinBuffer::updateFields( QgsFields& fields ) { QgsField f = joinFields[idx]; f.setName( joinLayer->name() + "_" + f.name() ); - fields.append( f, QgsFields::OriginJoin, idx + (joinIdx*1000) ); + fields.append( f, QgsFields::OriginJoin, idx + ( joinIdx*1000 ) ); } } } @@ -153,10 +154,10 @@ void QgsVectorLayerJoinBuffer::readXml( const QDomNode& layer_node ) const QgsVectorJoinInfo* QgsVectorLayerJoinBuffer::joinForFieldIndex( int index, const QgsFields& fields, int& sourceFieldIndex ) const { - if ( fields.fieldOrigin(index) != QgsFields::OriginJoin ) + if ( fields.fieldOrigin( index ) != QgsFields::OriginJoin ) return 0; - int originIndex = fields.fieldOriginIndex(index); + int originIndex = fields.fieldOriginIndex( index ); int sourceJoinIndex = originIndex / 1000; sourceFieldIndex = originIndex % 1000; diff --git a/src/core/qgsvectorlayerundocommand.cpp b/src/core/qgsvectorlayerundocommand.cpp index 2a639e1f14f..6ad9df8d8bc 100644 --- a/src/core/qgsvectorlayerundocommand.cpp +++ b/src/core/qgsvectorlayerundocommand.cpp @@ -28,7 +28,7 @@ QgsVectorLayerUndoCommandAddFeature::QgsVectorLayerUndoCommandAddFeature( QgsVectorLayerEditBuffer* buffer, QgsFeature& f ) - : QgsVectorLayerUndoCommand(buffer) + : QgsVectorLayerUndoCommand( buffer ) { static int addedIdLowWaterMark = -1; @@ -47,12 +47,12 @@ QgsVectorLayerUndoCommandAddFeature::QgsVectorLayerUndoCommandAddFeature( QgsVec void QgsVectorLayerUndoCommandAddFeature::undo() { - QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.find(mFeature.id()); + QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.find( mFeature.id() ); Q_ASSERT( it != mBuffer->mAddedFeatures.end() ); - mBuffer->mAddedFeatures.remove(mFeature.id()); + mBuffer->mAddedFeatures.remove( mFeature.id() ); if ( mFeature.geometry() ) - cache()->removeGeometry(mFeature.id()); + cache()->removeGeometry( mFeature.id() ); emit mBuffer->featureDeleted( mFeature.id() ); } @@ -70,7 +70,7 @@ void QgsVectorLayerUndoCommandAddFeature::redo() QgsVectorLayerUndoCommandDeleteFeature::QgsVectorLayerUndoCommandDeleteFeature( QgsVectorLayerEditBuffer* buffer, QgsFeatureId fid ) - : QgsVectorLayerUndoCommand(buffer) + : QgsVectorLayerUndoCommand( buffer ) { mFid = fid; @@ -113,8 +113,8 @@ void QgsVectorLayerUndoCommandDeleteFeature::redo() QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry( QgsVectorLayerEditBuffer* buffer, QgsFeatureId fid, QgsGeometry* newGeom ) - : QgsVectorLayerUndoCommand(buffer), - mFid(fid) + : QgsVectorLayerUndoCommand( buffer ), + mFid( fid ) { if ( FID_IS_NEW( mFid ) ) @@ -125,13 +125,13 @@ QgsVectorLayerUndoCommandChangeGeometry::QgsVectorLayerUndoCommandChangeGeometry } else { - bool changedAlready = mBuffer->mChangedGeometries.contains(mFid); + bool changedAlready = mBuffer->mChangedGeometries.contains( mFid ); QgsGeometry geom; - bool cachedGeom = cache()->geometry(mFid, geom); - mOldGeom = (changedAlready && cachedGeom) ? new QgsGeometry( geom ) : 0; + bool cachedGeom = cache()->geometry( mFid, geom ); + mOldGeom = ( changedAlready && cachedGeom ) ? new QgsGeometry( geom ) : 0; } - mNewGeom = new QgsGeometry(*newGeom); + mNewGeom = new QgsGeometry( *newGeom ); } QgsVectorLayerUndoCommandChangeGeometry::~QgsVectorLayerUndoCommandChangeGeometry() @@ -161,7 +161,7 @@ void QgsVectorLayerUndoCommandChangeGeometry::undo() mBuffer->mChangedGeometries.remove( mFid ); QgsFeature f; - if ( layer()->featureAtId( mFid, f, true, false ) && f.geometry() ) + if ( layer()->getFeatures( QgsFeatureRequest().setFilterFid( mFid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( f ) && f.geometry() ) { cache()->cacheGeometry( mFid, *f.geometry() ); emit mBuffer->geometryChanged( mFid, *f.geometry() ); @@ -199,11 +199,11 @@ void QgsVectorLayerUndoCommandChangeGeometry::redo() QgsVectorLayerUndoCommandChangeAttribute::QgsVectorLayerUndoCommandChangeAttribute( QgsVectorLayerEditBuffer* buffer, QgsFeatureId fid, int fieldIndex, const QVariant& newValue ) - : QgsVectorLayerUndoCommand(buffer), - mFid(fid), - mFieldIndex(fieldIndex), - mNewValue(newValue), - mFirstChange(true) + : QgsVectorLayerUndoCommand( buffer ), + mFid( fid ), + mFieldIndex( fieldIndex ), + mNewValue( newValue ), + mFirstChange( true ) { if ( FID_IS_NEW( mFid ) ) @@ -296,8 +296,8 @@ void QgsVectorLayerUndoCommandChangeAttribute::redo() QgsVectorLayerUndoCommandAddAttribute::QgsVectorLayerUndoCommandAddAttribute( QgsVectorLayerEditBuffer* buffer, const QgsField& field ) - : QgsVectorLayerUndoCommand(buffer), - mField(field) + : QgsVectorLayerUndoCommand( buffer ), + mField( field ) { mFieldIndex = layer()->pendingFields().count(); } @@ -327,13 +327,13 @@ void QgsVectorLayerUndoCommandAddAttribute::redo() QgsVectorLayerUndoCommandDeleteAttribute::QgsVectorLayerUndoCommandDeleteAttribute( QgsVectorLayerEditBuffer* buffer, int fieldIndex ) - : QgsVectorLayerUndoCommand(buffer), + : QgsVectorLayerUndoCommand( buffer ), mFieldIndex( fieldIndex ) { const QgsFields& fields = layer()->pendingFields(); QgsFields::FieldOrigin origin = fields.fieldOrigin( mFieldIndex ); mOriginIndex = fields.fieldOriginIndex( mFieldIndex ); - mProviderField = (origin == QgsFields::OriginProvider); + mProviderField = ( origin == QgsFields::OriginProvider ); if ( !mProviderField ) { @@ -342,18 +342,18 @@ QgsVectorLayerUndoCommandDeleteAttribute::QgsVectorLayerUndoCommandDeleteAttribu } // save values of new features - for (QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.begin(); it != mBuffer->mAddedFeatures.end(); ++it) + for ( QgsFeatureMap::const_iterator it = mBuffer->mAddedFeatures.begin(); it != mBuffer->mAddedFeatures.end(); ++it ) { const QgsFeature& f = it.value(); - mDeletedValues.insert(f.id(), f.attribute(mFieldIndex)); + mDeletedValues.insert( f.id(), f.attribute( mFieldIndex ) ); } // save changed values - for (QgsChangedAttributesMap::const_iterator it = mBuffer->mChangedAttributeValues.begin(); it != mBuffer->mChangedAttributeValues.end(); ++it) + for ( QgsChangedAttributesMap::const_iterator it = mBuffer->mChangedAttributeValues.begin(); it != mBuffer->mChangedAttributeValues.end(); ++it ) { const QgsAttributeMap& attrs = it.value(); - if (attrs.contains(mFieldIndex)) - mDeletedValues.insert(it.key(), attrs[mFieldIndex]); + if ( attrs.contains( mFieldIndex ) ) + mDeletedValues.insert( it.key(), attrs[mFieldIndex] ); } } @@ -373,15 +373,15 @@ void QgsVectorLayerUndoCommandDeleteAttribute::undo() mBuffer->handleAttributeAdded( mFieldIndex ); // update changed attributes + new features // set previously used attributes of new features - for (QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.begin(); it != mBuffer->mAddedFeatures.end(); ++it) + for ( QgsFeatureMap::iterator it = mBuffer->mAddedFeatures.begin(); it != mBuffer->mAddedFeatures.end(); ++it ) { QgsFeature& f = it.value(); - f.setAttribute( mFieldIndex, mDeletedValues.value(f.id()) ); + f.setAttribute( mFieldIndex, mDeletedValues.value( f.id() ) ); } // set previously used changed attributes - for (QMap::const_iterator it = mDeletedValues.begin(); it != mDeletedValues.end(); ++it) + for ( QMap::const_iterator it = mDeletedValues.begin(); it != mDeletedValues.end(); ++it ) { - if (!FID_IS_NEW( it.key() )) + if ( !FID_IS_NEW( it.key() ) ) { QgsAttributeMap& attrs = mBuffer->mChangedAttributeValues[it.key()]; // also adds record if nonexistant attrs.insert( mFieldIndex, it.value() ); diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp index 5030f5ddb12..3e76368dfac 100644 --- a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp @@ -800,8 +800,9 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer( QgsFeature f; QgsAttributeList lst; lst.append( attrNum ); - vlayer->select( lst, QgsRectangle(), false ); - while ( vlayer->nextFeature( f ) ) + + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( QgsAttributeList() ) ); + while ( fit.nextFeature( f ) ) values.append( f.attribute( attrNum ).toDouble() ); // calculate the breaks if ( mode == Quantile ) diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp index c61214a1590..6540e37bb5d 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp @@ -364,8 +364,8 @@ void QgsPointDisplacementRenderer::createDisplacementGroups( QgsVectorLayer* vla QgsFeature f; QList intersectList; - vlayer->select( attList, viewExtent, true, false ); - while ( vlayer->nextFeature( f ) ) + QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( viewExtent ).setSubsetOfAttributes( attList ) ); + while ( fit.nextFeature( f ) ) { intersectList.clear(); @@ -399,7 +399,7 @@ void QgsPointDisplacementRenderer::createDisplacementGroups( QgsVectorLayer* vla { QMap newMap; QgsFeature existingFeature; - vlayer->featureAtId( existingEntry, existingFeature ); + vlayer->getFeatures( QgsFeatureRequest().setFilterFid( existingEntry ) ).nextFeature( existingFeature ); newMap.insert( existingEntry, existingFeature ); mDisplacementIds.insert( existingEntry ); newMap.insert( f.id(), f ); @@ -409,8 +409,6 @@ void QgsPointDisplacementRenderer::createDisplacementGroups( QgsVectorLayer* vla } } } - //refresh the selection because the vector layer is going to step through all features now - vlayer->select( attList, viewExtent, true, false ); } QgsRectangle QgsPointDisplacementRenderer::searchRect( const QgsPoint& p ) const diff --git a/src/gui/attributetable/qgsattributetablememorymodel.cpp b/src/gui/attributetable/qgsattributetablememorymodel.cpp index a974eeafa09..8f2fa7cebfb 100644 --- a/src/gui/attributetable/qgsattributetablememorymodel.cpp +++ b/src/gui/attributetable/qgsattributetablememorymodel.cpp @@ -47,7 +47,7 @@ void QgsAttributeTableMemoryModel::loadLayer() rect = mCurrentExtent; } - mLayer->select( mLayer->pendingAllAttributesList(), rect, false ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFilterRect( rect ).setFlags( QgsFeatureRequest::NoGeometry ) ); if ( behaviour != 1 ) mFeatureMap.reserve( mLayer->pendingFeatureCount() + 50 ); @@ -60,7 +60,7 @@ void QgsAttributeTableMemoryModel::loadLayer() t.start(); QgsFeature f; - while ( mLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { if ( behaviour == 1 && !mLayer->selectedFeaturesIds().contains( f.id() ) ) continue; diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp index a272bdf5e7f..98c471e35c6 100644 --- a/src/gui/attributetable/qgsattributetablemodel.cpp +++ b/src/gui/attributetable/qgsattributetablemodel.cpp @@ -64,7 +64,7 @@ bool QgsAttributeTableModel::featureAtId( QgsFeatureId fid ) const mFeat = mFeatureMap[ fid ]; return true; } - else if ( mLayer->featureAtId( fid, mFeat, false, true ) ) + else if ( mLayer->getFeatures( QgsFeatureRequest().setFilterFid( fid ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( mFeat ) ) { QSettings settings; int cacheSize = qMax( 1, settings.value( "/qgis/attributeTableRowCache", "10000" ).toInt() ); @@ -334,10 +334,10 @@ void QgsAttributeTableModel::loadLayer() } } - mLayer->select( attributeList, rect, false ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFilterRect( rect ).setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributeList ) ); QgsFeature f; - for ( i = 0; mLayer->nextFeature( f ); ++i ) + for ( i = 0; fit.nextFeature( f ); ++i ) { if ( !filter || renderer->willRenderFeature( f ) ) { @@ -484,10 +484,10 @@ void QgsAttributeTableModel::sort( int column, Qt::SortOrder order ) mSortList.clear(); int idx = fieldIdx( column ); - mLayer->select( QgsAttributeList() << idx, rect, false ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFilterRect( rect ).setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( QgsAttributeList() << idx ) ); QgsFeature f; - while ( mLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { if ( behaviour == 1 && !mIdRowMap.contains( f.id() ) ) continue; diff --git a/src/gui/qgsattributeeditor.cpp b/src/gui/qgsattributeeditor.cpp index 83d36a91ab1..ce3b55a87b5 100644 --- a/src/gui/qgsattributeeditor.cpp +++ b/src/gui/qgsattributeeditor.cpp @@ -224,9 +224,10 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed attributes << vi; if ( fi >= 0 ) attributes << fi; - layer->select( attributes, QgsRectangle(), false ); + + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attributes ) ); QgsFeature f; - while ( layer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { if ( fi >= 0 && f.attribute( fi ).toString() != data.mFilterAttributeValue ) continue; diff --git a/src/gui/qgsexpressionbuilderwidget.cpp b/src/gui/qgsexpressionbuilderwidget.cpp index 293a14525aa..c7fa8efd784 100644 --- a/src/gui/qgsexpressionbuilderwidget.cpp +++ b/src/gui/qgsexpressionbuilderwidget.cpp @@ -282,8 +282,7 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged() if ( !mFeature.isValid() ) { - mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), mLayer->geometryType() != QGis::NoGeometry && exp.needsGeometry() ); - mLayer->nextFeature( mFeature ); + mLayer->getFeatures( QgsFeatureRequest().setFlags(( mLayer->geometryType() != QGis::NoGeometry && exp.needsGeometry() ) ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ).nextFeature( mFeature ); } if ( mFeature.isValid() ) diff --git a/src/gui/qgsformannotationitem.cpp b/src/gui/qgsformannotationitem.cpp index 4b300b8c5ff..acb46ad6820 100644 --- a/src/gui/qgsformannotationitem.cpp +++ b/src/gui/qgsformannotationitem.cpp @@ -85,7 +85,7 @@ QWidget* QgsFormAnnotationItem::createDesignerWidget( const QString& filePath ) if ( mVectorLayer && mHasAssociatedFeature ) { QgsFeature f; - if ( mVectorLayer->featureAtId( mFeature, f, false, true ) ) + if ( mVectorLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeature ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) ) { const QgsFields& fields = mVectorLayer->pendingFields(); const QgsAttributes& attrs = f.attributes(); @@ -224,19 +224,19 @@ void QgsFormAnnotationItem::setFeatureForMapPosition() return; } - QgsAttributeList noAttributes; QSettings settings; double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble(); double halfIdentifyWidth = mMapCanvas->extent().width() / 100 / 2 * identifyValue; QgsRectangle searchRect( mMapPosition.x() - halfIdentifyWidth, mMapPosition.y() - halfIdentifyWidth, mMapPosition.x() + halfIdentifyWidth, mMapPosition.y() + halfIdentifyWidth ); - mVectorLayer->select( noAttributes, searchRect, false, true ); + + QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFilterRect( searchRect ).setFlags( QgsFeatureRequest::NoGeometry | QgsFeatureRequest::ExactIntersect ).setSubsetOfAttributes( QgsAttributeList() ) ); QgsFeature currentFeature; QgsFeatureId currentFeatureId = 0; bool featureFound = false; - while ( mVectorLayer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { currentFeatureId = currentFeature.id(); featureFound = true; diff --git a/src/gui/qgshtmlannotationitem.cpp b/src/gui/qgshtmlannotationitem.cpp index d90af3db902..f1c4fea9bf9 100644 --- a/src/gui/qgshtmlannotationitem.cpp +++ b/src/gui/qgshtmlannotationitem.cpp @@ -193,13 +193,14 @@ void QgsHtmlAnnotationItem::setFeatureForMapPosition() double halfIdentifyWidth = mMapCanvas->extent().width() / 100 / 2 * identifyValue; QgsRectangle searchRect( mMapPosition.x() - halfIdentifyWidth, mMapPosition.y() - halfIdentifyWidth, mMapPosition.x() + halfIdentifyWidth, mMapPosition.y() + halfIdentifyWidth ); - mVectorLayer->select( mVectorLayer->pendingAllAttributesList() , searchRect, false, true ); + + QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFilterRect( searchRect ).setFlags( QgsFeatureRequest::NoGeometry | QgsFeatureRequest::ExactIntersect ) ); QgsFeature currentFeature; QgsFeatureId currentFeatureId = 0; bool featureFound = false; - while ( mVectorLayer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { currentFeatureId = currentFeature.id(); featureFound = true; @@ -212,7 +213,6 @@ void QgsHtmlAnnotationItem::setFeatureForMapPosition() QString newtext = QgsExpression::replaceExpressionText( mHtmlSource, mFeature, vectorLayer() ); mWebView->setHtml( newtext ); - } void QgsHtmlAnnotationItem::updateVisibility() diff --git a/src/gui/qgsmaptip.cpp b/src/gui/qgsmaptip.cpp index 358fda0758e..356f6d2659c 100644 --- a/src/gui/qgsmaptip.cpp +++ b/src/gui/qgsmaptip.cpp @@ -95,8 +95,7 @@ QString QgsMapTip::fetchFeature( QgsMapLayer *layer, QgsPoint &mapPosition, QgsM QgsFeature feature; - vlayer->select( vlayer->pendingAllAttributesList() , r, true, true ); - if ( !vlayer->nextFeature( feature ) ) + if ( !vlayer->getFeatures( QgsFeatureRequest().setFilterRect( r ).setFlags( QgsFeatureRequest::ExactIntersect ) ).nextFeature( feature ) ) return ""; int idx = vlayer->fieldNameIndex( vlayer->displayField() ); diff --git a/src/gui/qgssearchquerybuilder.cpp b/src/gui/qgssearchquerybuilder.cpp index 407a024736a..2524954e9ee 100644 --- a/src/gui/qgssearchquerybuilder.cpp +++ b/src/gui/qgssearchquerybuilder.cpp @@ -123,7 +123,7 @@ void QgsSearchQueryBuilder::getFieldValues( int limit ) QgsAttributeList attrs; attrs.append( fieldIndex ); - mLayer->select( attrs, QgsRectangle(), false ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ).setSubsetOfAttributes( attrs ) ); lstValues->setCursor( Qt::WaitCursor ); // Block for better performance @@ -133,7 +133,7 @@ void QgsSearchQueryBuilder::getFieldValues( int limit ) /**MH: keep already inserted values in a set. Querying is much faster compared to QStandardItemModel::findItems*/ QSet insertedValues; - while ( mLayer->nextFeature( feat ) && + while ( fit.nextFeature( feat ) && ( limit == 0 || mModelValues->rowCount() != limit ) ) { value = feat.attribute( fieldIndex ).toString(); @@ -209,10 +209,9 @@ long QgsSearchQueryBuilder::countRecords( QString searchString ) QApplication::setOverrideCursor( Qt::WaitCursor ); - QgsAttributeList allAttributes = mLayer->pendingAllAttributesList(); - mLayer->select( allAttributes, QgsRectangle(), fetchGeom ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFlags( fetchGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ); - while ( mLayer->nextFeature( feat ) ) + while ( fit.nextFeature( feat ) ) { QVariant value = search.evaluate( &feat ); if ( value.toInt() != 0 ) diff --git a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp index ca095b8fc02..999e9dd988f 100644 --- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp @@ -419,7 +419,7 @@ void QgsRuleBasedRendererV2Widget::countFeatures() countMap[rule].duplicateCount = 0; } - mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), false, false ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) ); QgsRenderContext renderContext; renderContext.setRendererScale( 0 ); // ignore scale @@ -431,7 +431,7 @@ void QgsRuleBasedRendererV2Widget::countFeatures() int featuresCounted = 0; QgsFeature f; - while ( mLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QgsRuleBasedRendererV2::RuleList featureRuleList = mRenderer->rootRule()->rulesForFeature( f ); @@ -551,11 +551,11 @@ void QgsRendererRulePropsDialog::testFilter() QApplication::setOverrideCursor( Qt::WaitCursor ); - mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), false ); + QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) ); int count = 0; QgsFeature f; - while ( mLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { QVariant value = filter.evaluate( &f ); if ( value.toInt() != 0 ) diff --git a/src/mapserver/qgswfsserver.cpp b/src/mapserver/qgswfsserver.cpp index 9557f7999b9..701e857854d 100644 --- a/src/mapserver/qgswfsserver.cpp +++ b/src/mapserver/qgswfsserver.cpp @@ -453,7 +453,11 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format if ( maxFeatures == -1 ) maxFeat += layer->featureCount(); - layer->select( attrIndexes, searchRect, mWithGeom, true ); + QgsFeatureIterator fit = layer->getFeatures( + QgsFeatureRequest() + .setFilterRect( searchRect ) + .setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ) + .setSubsetOfAttributes( attrIndexes ) ); long featCounter = 0; QDomNodeList filterNodes = queryElem.elementsByTagName( "Filter" ); @@ -477,7 +481,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } //Need to be test for propertyname - layer->featureAtId( fid.toInt(), feature, mWithGeom, true ); + layer->getFeatures( QgsFeatureRequest() + .setFilterFid( fid.toInt() ) + .setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ) + ).nextFeature( feature ); if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -493,21 +500,28 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format { QDomElement bboxElem = filterElem.firstChildElement(); QDomElement childElem = bboxElem.firstChildElement(); + + QgsFeatureRequest req; + req.setSubsetOfAttributes( attrIndexes ); + req.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ); + while ( !childElem.isNull() ) { if ( childElem.tagName() == "Box" ) { - QgsRectangle* rect = new QgsRectangle( childElem ); - layer->select( attrIndexes, *rect, mWithGeom, true ); + req.setFilterRect( QgsRectangle( childElem ) ); } else if ( childElem.tagName() != "PropertyName" ) { - QgsGeometry* geom = QgsGeometry::fromGML2( childElem ); - layer->select( attrIndexes, geom->boundingBox(), mWithGeom, true ); + QgsGeometry *geom = QgsGeometry::fromGML2( childElem ); + req.setFilterRect( geom->boundingBox() ); + delete geom; } childElem = childElem.nextSiblingElement(); } - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + + QgsFeatureIterator fit = layer->getFeatures( req ); + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -526,7 +540,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } if ( mFilter ) { - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { QVariant res = mFilter->evaluate( &feature, fields ); if ( mFilter->hasEvalError() ) @@ -548,7 +562,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } else { - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -784,7 +798,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format if ( !fidStr.startsWith( tnStr ) ) continue; //Need to be test for propertyname - layer->featureAtId( fidStr.section( ".", 1, 1 ).toInt(), feature, mWithGeom, true ); + layer->getFeatures( QgsFeatureRequest() + .setFilterFid( fidStr.section( ".", 1, 1 ).toInt() ) + .setFlags( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) + ).nextFeature( feature ); if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -796,7 +813,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } else if ( expFilterOk ) { - layer->select( attrIndexes, searchRect, mWithGeom, true ); + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest() + .setFilterRect( searchRect ) + .setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ) + .setSubsetOfAttributes( attrIndexes ) ); QgsExpression *mFilter = new QgsExpression( expFilter ); if ( mFilter->hasParserError() ) { @@ -804,7 +824,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } if ( mFilter ) { - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { QVariant res = mFilter->evaluate( &feature, fields ); if ( mFilter->hasEvalError() ) @@ -826,7 +846,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } else if ( filterOk ) { - layer->select( attrIndexes, searchRect, mWithGeom, true ); QDomElement filterElem = filter.firstChildElement(); QDomNodeList fidNodes = filterElem.elementsByTagName( "FeatureId" ); if ( fidNodes.size() > 0 ) @@ -845,7 +864,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } //Need to be test for propertyname - layer->featureAtId( fid.toInt(), feature, mWithGeom, true ); + layer->getFeatures( QgsFeatureRequest() + .setFilterFid( fid.toInt() ) + .setFlags( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) + ).nextFeature( feature ); if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -861,21 +883,28 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format { QDomElement bboxElem = filterElem.firstChildElement(); QDomElement childElem = bboxElem.firstChildElement(); + + QgsFeatureRequest req; + req.setSubsetOfAttributes( attrIndexes ); + req.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ); + while ( !childElem.isNull() ) { if ( childElem.tagName() == "Box" ) { - QgsRectangle* rect = new QgsRectangle( childElem ); - layer->select( attrIndexes, *rect, mWithGeom, true ); + req.setFilterRect( QgsRectangle( childElem ) ); } else if ( childElem.tagName() != "PropertyName" ) { QgsGeometry* geom = QgsGeometry::fromGML2( childElem ); - layer->select( attrIndexes, geom->boundingBox(), mWithGeom, true ); + req.setFilterRect( geom->boundingBox() ); + delete geom; } childElem = childElem.nextSiblingElement(); } - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + + QgsFeatureIterator fit = layer->getFeatures( req ); + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -894,7 +923,11 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } if ( mFilter ) { - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest() + .setFilterRect( searchRect ) + .setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ) + .setSubsetOfAttributes( attrIndexes ) ); + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { QVariant res = mFilter->evaluate( &feature, fields ); if ( mFilter->hasEvalError() ) @@ -917,8 +950,11 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format } else { - layer->select( attrIndexes, searchRect, mWithGeom, true ); - while ( layer->nextFeature( feature ) && featureCounter < maxFeat ) + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest() + .setFilterRect( searchRect ) + .setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) ) + .setSubsetOfAttributes( attrIndexes ) ); + while ( fit.nextFeature( feature ) && featureCounter < maxFeat ) { if ( featureCounter == 0 ) startGetFeature( request, format, layerCrs, &searchRect ); @@ -1489,7 +1525,7 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs { QgsFeatureIds fids; - QgsVectorDataProvider* provider = layer->dataProvider(); + QgsVectorDataProvider *provider = layer->dataProvider(); QDomNodeList fidNodes = filterElem.elementsByTagName( "FeatureId" ); if ( fidNodes.size() != 0 ) @@ -1517,7 +1553,8 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs { QgsFeature feature; const QgsFields& fields = provider->fields(); - while ( layer->nextFeature( feature ) ) + QgsFeatureIterator fit = layer->getFeatures(); + while ( fit.nextFeature( feature ) ) { QVariant res = mFilter->evaluate( &feature, fields ); if ( mFilter->hasEvalError() ) diff --git a/src/mapserver/qgswmsserver.cpp b/src/mapserver/qgswmsserver.cpp index 77727629229..82db831f062 100644 --- a/src/mapserver/qgswmsserver.cpp +++ b/src/mapserver/qgswmsserver.cpp @@ -1265,8 +1265,11 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer, bool addWktGeometry = mConfigParser && mConfigParser->featureInfoWithWktGeometry(); const QSet& excludedAttributes = layer->excludeAttributesWMS(); - layer->select( layer->pendingAllAttributesList(), searchRect, addWktGeometry || featureBBox, true ); - while ( layer->nextFeature( feature ) ) + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest() + .setFilterRect( searchRect ) + .setFlags((( addWktGeometry || featureBBox ) ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) | QgsFeatureRequest::ExactIntersect ) + ); + while ( fit.nextFeature( feature ) ) { ++featureCounter; if ( featureCounter > nFeatures ) diff --git a/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp b/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp index f435a51476d..c611059205f 100644 --- a/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp +++ b/src/plugins/diagram_overlay/qgsdiagramoverlay.cpp @@ -80,7 +80,7 @@ void QgsDiagramOverlay::createOverlayObjects( const QgsRenderContext& renderCont if ( mVectorLayer && mDiagramRenderer ) { //set spatial filter on data provider - mVectorLayer->select( mAttributes, renderContext.extent() ); + QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFilterRect( renderContext.extent() ).setSubsetOfAttributes( mAttributes ) ); QgsFeature currentFeature; QgsGeometry* currentGeometry = 0; @@ -93,7 +93,7 @@ void QgsDiagramOverlay::createOverlayObjects( const QgsRenderContext& renderCont std::list::iterator bufferIt; std::list::iterator sizeIt; - while ( mVectorLayer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { //todo: insert more objects for multipart features if ( mDiagramRenderer->getDiagramDimensions( width, height, currentFeature, renderContext ) != 0 ) @@ -121,14 +121,14 @@ void QgsDiagramOverlay::drawOverlayObjects( QgsRenderContext& context ) const if ( mVectorLayer && mDiagramRenderer ) { //set spatial filter on data provider - mVectorLayer->select( mAttributes, context.extent() ); + QgsFeatureIterator fit = mVectorLayer->getFeatures( QgsFeatureRequest().setFilterRect( context.extent() ).setSubsetOfAttributes( mAttributes ) ); QgsFeature currentFeature; QImage* currentDiagramImage = 0; QPainter* painter = context.painter(); - while ( mVectorLayer->nextFeature( currentFeature ) ) + while ( fit.nextFeature( currentFeature ) ) { //request diagram from renderer currentDiagramImage = mDiagramRenderer->renderDiagram( currentFeature, context ); diff --git a/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp b/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp index 12e0daba5dc..edc96f051f8 100644 --- a/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp +++ b/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp @@ -568,7 +568,7 @@ QgsFeature* eVisGenericEventBrowserGui::featureAtId( QgsFeatureId id ) //It has mostly been stripped down now if ( mDataProvider && mFeatureIds.size( ) != 0 ) { - if ( !mVectorLayer->featureAtId( id, mFeature, true, true ) ) + if ( !mVectorLayer->getFeatures( QgsFeatureRequest().setFilterFid( id ) ).nextFeature( mFeature ) ) { return 0; } diff --git a/src/plugins/evis/idtool/eviseventidtool.cpp b/src/plugins/evis/idtool/eviseventidtool.cpp index 13e348f309a..90942e6d86b 100644 --- a/src/plugins/evis/idtool/eviseventidtool.cpp +++ b/src/plugins/evis/idtool/eviseventidtool.cpp @@ -108,11 +108,11 @@ void eVisEventIdTool::select( QgsPoint thePoint ) //Rather than add to the current selection, clear all selected features myLayer->removeSelection( false ); //select features - myLayer->select( QgsAttributeList(), myRectangle, true, true ); + QgsFeatureIterator fit = myLayer->getFeatures( QgsFeatureRequest().setFilterRect( myRectangle ).setFlags( QgsFeatureRequest::ExactIntersect ).setSubsetOfAttributes( QgsAttributeList() ) ); QgsFeature f; QgsFeatureIds newSelectedFeatures; - while ( myLayer->nextFeature( f ) ) + while ( fit.nextFeature( f ) ) { newSelectedFeatures.insert( f.id() ); } diff --git a/src/plugins/globe/globe_plugin.cpp b/src/plugins/globe/globe_plugin.cpp index 663cd0b8d67..95736040287 100644 --- a/src/plugins/globe/globe_plugin.cpp +++ b/src/plugins/globe/globe_plugin.cpp @@ -389,10 +389,9 @@ void GlobePlugin::setupMap() if ( model ) { QgsVectorLayer* layer = mSettingsDialog->modelLayer(); - QgsAttributeList fetchAttributes; - layer->select( fetchAttributes ); //TODO: select only visible features + QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ) ); //TODO: select only visible features QgsFeature feature; - while ( layer->nextFeature( feature ) ) + while ( fit.nextFeature( feature ) ) { QgsPoint point = feature.geometry()->asPoint(); placeNode( model, point.y(), point.x() ); diff --git a/src/plugins/heatmap/heatmap.cpp b/src/plugins/heatmap/heatmap.cpp index 81ed591c4eb..4aa1da0037f 100644 --- a/src/plugins/heatmap/heatmap.cpp +++ b/src/plugins/heatmap/heatmap.cpp @@ -172,7 +172,7 @@ void Heatmap::run() } // This might have attributes or mightnot have attibutes at all // based on the variableRadius() and weighted() - inputLayer->select( myAttrList ); + QgsFeatureIterator fit = inputLayer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( myAttrList ) ); int totalFeatures = inputLayer->featureCount(); int counter = 0; @@ -181,7 +181,7 @@ void Heatmap::run() QgsFeature myFeature; - while ( inputLayer->nextFeature( myFeature ) ) + while ( fit.nextFeature( myFeature ) ) { counter++; p.setValue( counter ); diff --git a/src/plugins/spatialquery/qgsreaderfeatures.cpp b/src/plugins/spatialquery/qgsreaderfeatures.cpp index 16cfa9b4316..512992d927d 100644 --- a/src/plugins/spatialquery/qgsreaderfeatures.cpp +++ b/src/plugins/spatialquery/qgsreaderfeatures.cpp @@ -53,7 +53,7 @@ void QgsReaderFeatures::initReader( bool useSelection ) } else { - mLayer->select( QgsAttributeList() ); + mFit = mLayer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() ) ); mFuncNextFeature = &QgsReaderFeatures::nextFeatureTotal; } @@ -61,20 +61,16 @@ void QgsReaderFeatures::initReader( bool useSelection ) bool QgsReaderFeatures::nextFeatureTotal( QgsFeature & feature ) { - return mLayer->nextFeature( feature ); + return mFit.nextFeature( feature ); } // bool QgsReaderFeatures::nextFeatureTotal ( QgsFeature & feature ) bool QgsReaderFeatures::nextFeatureSelected( QgsFeature & feature ) { - bool bReturn = true; if ( mIterSelectedFeature == mListSelectedFeature.end() ) - { - bReturn = false; - } - else - { - feature = *mIterSelectedFeature; - mIterSelectedFeature++; - } - return bReturn; + return false; + + feature = *mIterSelectedFeature; + mIterSelectedFeature++; + + return true; } // bool QgsReaderFeatures::nextFeatureSelected( QgsFeature &feature ) diff --git a/src/plugins/spatialquery/qgsreaderfeatures.h b/src/plugins/spatialquery/qgsreaderfeatures.h index 1983828e3cd..a8880f62fff 100644 --- a/src/plugins/spatialquery/qgsreaderfeatures.h +++ b/src/plugins/spatialquery/qgsreaderfeatures.h @@ -72,6 +72,7 @@ class QgsReaderFeatures QgsFeatureList mListSelectedFeature; QList::iterator mIterSelectedFeature; bool ( QgsReaderFeatures::* mFuncNextFeature )( QgsFeature & ); + QgsFeatureIterator mFit; }; #endif // READERFEATURES_H diff --git a/src/plugins/spatialquery/qgsrubberselectid.cpp b/src/plugins/spatialquery/qgsrubberselectid.cpp index 9e293b612b4..e5dc2554784 100644 --- a/src/plugins/spatialquery/qgsrubberselectid.cpp +++ b/src/plugins/spatialquery/qgsrubberselectid.cpp @@ -64,7 +64,7 @@ void QgsRubberSelectId::addFeature( QgsVectorLayer* lyr, QgsFeatureId fid ) setStyle(); } QgsFeature feat; - if ( !lyr->featureAtId( fid, feat, true, false ) ) + if ( !lyr->getFeatures( QgsFeatureRequest().setFilterFid( fid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( feat ) ) { return; } diff --git a/src/plugins/spatialquery/qgsspatialquery.cpp b/src/plugins/spatialquery/qgsspatialquery.cpp index ecd9e699a5a..7a0607103f0 100644 --- a/src/plugins/spatialquery/qgsspatialquery.cpp +++ b/src/plugins/spatialquery/qgsspatialquery.cpp @@ -293,7 +293,7 @@ void QgsSpatialQuery::populateIndexResult( QList::iterator iterIdReference = listIdReference.begin(); for ( ; iterIdReference != listIdReference.end(); iterIdReference++ ) { - mLayerReference->featureAtId( *iterIdReference, featureReference ); + mLayerReference->getFeatures( QgsFeatureRequest().setFilterFid( *iterIdReference ) ).nextFeature( featureReference ); geomReference = featureReference.geometry(); if (( geomTarget->*op )( geomReference ) ) { @@ -321,7 +321,7 @@ void QgsSpatialQuery::populateIndexResultDisjoint( bool addIndex = true; for ( ; iterIdReference != listIdReference.end(); iterIdReference++ ) { - mLayerReference->featureAtId( *iterIdReference, featureReference ); + mLayerReference->getFeatures( QgsFeatureRequest().setFilterFid( *iterIdReference ) ).nextFeature( featureReference ); geomReference = featureReference.geometry(); if ( !( geomTarget->*op )( geomReference ) ) diff --git a/src/plugins/spatialquery/qgsspatialquerydialog.cpp b/src/plugins/spatialquery/qgsspatialquerydialog.cpp index 93624d4e38d..b10ec84aa01 100644 --- a/src/plugins/spatialquery/qgsspatialquerydialog.cpp +++ b/src/plugins/spatialquery/qgsspatialquerydialog.cpp @@ -673,7 +673,7 @@ void QgsSpatialQueryDialog::zoomFeature( QgsVectorLayer* lyr, QgsFeatureId fid ) } QgsFeature feat; - if ( !lyr->featureAtId( fid, feat, true, false ) ) + if ( !lyr->getFeatures( QgsFeatureRequest().setFilterFid( fid ).setSubsetOfAttributes( QgsAttributeList() ) ).nextFeature( feat ) ) { return; } diff --git a/tests/src/core/testqgscomposerlabel.cpp b/tests/src/core/testqgscomposerlabel.cpp index aff6d1c092e..39049b256e9 100644 --- a/tests/src/core/testqgscomposerlabel.cpp +++ b/tests/src/core/testqgscomposerlabel.cpp @@ -125,11 +125,10 @@ void TestQgsComposerLabel::evaluation() void TestQgsComposerLabel::feature_evaluation() { - QgsAttributeList allAttrs = mVectorLayer->pendingAllAttributesList(); - mVectorLayer->select( allAttrs ); + QgsFeatureIterator fit = mVectorLayer->getFeatures(); QgsFeature feat; - mVectorLayer->nextFeature( feat ); + fit.nextFeature( feat ); { // evaluation with a feature mComposerLabel->setExpressionContext( &feat, mVectorLayer ); @@ -138,7 +137,7 @@ void TestQgsComposerLabel::feature_evaluation() QString expected = "Basse-Normandie_ok"; QCOMPARE( evaluated, expected ); } - mVectorLayer->nextFeature( feat ); + fit.nextFeature( feat ); { // evaluation with a feature mComposerLabel->setExpressionContext( &feat, mVectorLayer ); diff --git a/tests/src/core/testqgsvectorlayer.cpp b/tests/src/core/testqgsvectorlayer.cpp index 0eb798265dd..3b1e5b3ff07 100644 --- a/tests/src/core/testqgsvectorlayer.cpp +++ b/tests/src/core/testqgsvectorlayer.cpp @@ -144,8 +144,8 @@ class TestQgsVectorLayer: public QObject QgsAttributeList myList; myList << 0 << 1 << 2 << 3; int myCount = 0; - mpNonSpatialLayer->select( myList ); - while ( mpNonSpatialLayer->nextFeature( f ) ) + QgsFeatureIterator fit = mpNonSpatialLayer->getFeatures( QgsFeatureRequest().setSubsetOfAttributes( myList ) ); + while ( fit.nextFeature( f ) ) { qDebug( "Getting non-spatial feature from layer" ); myCount++;