Skip to content

Commit efc00c3

Browse files
committedOct 23, 2017
[Geometry checker] Fix features not correctly removed from QgsFeaturePool spatial index
1 parent 084660a commit efc00c3

File tree

7 files changed

+22
-15
lines changed

7 files changed

+22
-15
lines changed
 

‎src/analysis/vector/geometry_checker/qgsfeaturepool.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ void QgsFeaturePool::addFeature( QgsFeature &feature )
105105

106106
void QgsFeaturePool::updateFeature( QgsFeature &feature )
107107
{
108+
QgsFeature origFeature;
109+
get( feature.id(), origFeature );
110+
108111
QgsGeometryMap geometryMap;
109112
geometryMap.insert( feature.id(), QgsGeometry( feature.geometry().geometry()->clone() ) );
110113
QgsChangedAttributesMap changedAttributesMap;
@@ -120,19 +123,23 @@ void QgsFeaturePool::updateFeature( QgsFeature &feature )
120123
mLayer->dataProvider()->changeAttributeValues( changedAttributesMap );
121124
mLayerMutex.unlock();
122125
mIndexMutex.lock();
123-
mIndex.deleteFeature( feature );
126+
mIndex.deleteFeature( origFeature );
124127
mIndex.insertFeature( feature );
125128
mIndexMutex.unlock();
126129
}
127130

128-
void QgsFeaturePool::deleteFeature( QgsFeature &feature )
131+
void QgsFeaturePool::deleteFeature( const QgsFeatureId &fid )
129132
{
130-
mIndexMutex.lock();
131-
mIndex.deleteFeature( feature );
132-
mIndexMutex.unlock();
133+
QgsFeature origFeature;
134+
if ( get( fid, origFeature ) )
135+
{
136+
mIndexMutex.lock();
137+
mIndex.deleteFeature( origFeature );
138+
mIndexMutex.unlock();
139+
}
133140
mLayerMutex.lock();
134-
mFeatureCache.remove( feature.id() );
135-
mLayer->dataProvider()->deleteFeatures( QgsFeatureIds() << feature.id() );
141+
mFeatureCache.remove( origFeature.id() );
142+
mLayer->dataProvider()->deleteFeatures( QgsFeatureIds() << fid );
136143
mLayerMutex.unlock();
137144
}
138145

‎src/analysis/vector/geometry_checker/qgsfeaturepool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class ANALYSIS_EXPORT QgsFeaturePool : public QObject
3636
bool get( QgsFeatureId id, QgsFeature &feature );
3737
void addFeature( QgsFeature &feature );
3838
void updateFeature( QgsFeature &feature );
39-
void deleteFeature( QgsFeature &feature );
39+
void deleteFeature( const QgsFeatureId &fid );
4040
QgsFeatureIds getIntersects( const QgsRectangle &rect ) const;
4141
QgsVectorLayer *getLayer() const { return mLayer; }
4242
const QgsFeatureIds &getFeatureIds() const { return mFeatureIds; }

‎src/analysis/vector/geometry_checker/qgsgeometrycheck.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ void QgsGeometryCheck::deleteFeatureGeometryPart( const QString &layerId, QgsFea
185185
static_cast<QgsGeometryCollection *>( geom )->removeGeometry( partIdx );
186186
if ( static_cast<QgsGeometryCollection *>( geom )->numGeometries() == 0 )
187187
{
188-
featurePool->deleteFeature( feature );
188+
featurePool->deleteFeature( feature.id() );
189189
changes[layerId][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) );
190190
}
191191
else
@@ -197,7 +197,7 @@ void QgsGeometryCheck::deleteFeatureGeometryPart( const QString &layerId, QgsFea
197197
}
198198
else
199199
{
200-
featurePool->deleteFeature( feature );
200+
featurePool->deleteFeature( feature.id() );
201201
changes[layerId][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) );
202202
}
203203
}

‎src/analysis/vector/geometry_checker/qgsgeometrycontainedcheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void QgsGeometryContainedCheck::fixError( QgsGeometryCheckError *error, int meth
9494
else if ( method == Delete )
9595
{
9696
changes[error->layerId()][featureA.id()].append( Change( ChangeFeature, ChangeRemoved ) );
97-
featurePoolA->deleteFeature( featureA );
97+
featurePoolA->deleteFeature( featureA.id() );
9898
error->setFixed( method );
9999
}
100100
else

‎src/analysis/vector/geometry_checker/qgsgeometryduplicatecheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ void QgsGeometryDuplicateCheck::fixError( QgsGeometryCheckError *error, int meth
117117
QgsAbstractGeometry *diffGeom = geomEngineA->symDifference( layerFeatureB.geometry() );
118118
if ( diffGeom && diffGeom->isEmpty() )
119119
{
120-
featurePoolB->deleteFeature( featureB );
120+
featurePoolB->deleteFeature( featureB.id() );
121121
changes[layerIdB][idB].append( Change( ChangeFeature, ChangeRemoved ) );
122122
}
123123

‎src/analysis/vector/geometry_checker/qgsgeometrymultipartcheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void QgsGeometryMultipartCheck::fixError( QgsGeometryCheckError *error, int meth
6464
}
6565
else if ( method == RemoveObject )
6666
{
67-
featurePool->deleteFeature( feature );
67+
featurePool->deleteFeature( feature.id() );
6868
error->setFixed( method );
6969
changes[error->layerId()][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) );
7070
}

‎src/analysis/vector/geometry_checker/qgsgeometrytypecheck.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ void QgsGeometryTypeCheck::fixError( QgsGeometryCheckError *error, int method, c
132132
// Delete feature
133133
else
134134
{
135-
featurePool->deleteFeature( feature );
135+
featurePool->deleteFeature( feature.id() );
136136
changes[error->layerId()][error->featureId()].append( Change( ChangeFeature, ChangeRemoved ) );
137137
}
138138
error->setFixed( method );
139139
}
140140
else if ( method == Delete )
141141
{
142-
featurePool->deleteFeature( feature );
142+
featurePool->deleteFeature( feature.id() );
143143
error->setFixed( method );
144144
changes[error->layerId()][error->featureId()].append( Change( ChangeFeature, ChangeRemoved ) );
145145
}

0 commit comments

Comments
 (0)
Please sign in to comment.