[Geometry checker] Fix features not correctly removed from QgsFeaturePool spatial index

This commit is contained in:
Sandro Mani 2017-10-19 17:57:05 +02:00
parent 084660a47f
commit efc00c38a1
7 changed files with 22 additions and 15 deletions

View File

@ -105,6 +105,9 @@ void QgsFeaturePool::addFeature( QgsFeature &feature )
void QgsFeaturePool::updateFeature( QgsFeature &feature ) void QgsFeaturePool::updateFeature( QgsFeature &feature )
{ {
QgsFeature origFeature;
get( feature.id(), origFeature );
QgsGeometryMap geometryMap; QgsGeometryMap geometryMap;
geometryMap.insert( feature.id(), QgsGeometry( feature.geometry().geometry()->clone() ) ); geometryMap.insert( feature.id(), QgsGeometry( feature.geometry().geometry()->clone() ) );
QgsChangedAttributesMap changedAttributesMap; QgsChangedAttributesMap changedAttributesMap;
@ -120,19 +123,23 @@ void QgsFeaturePool::updateFeature( QgsFeature &feature )
mLayer->dataProvider()->changeAttributeValues( changedAttributesMap ); mLayer->dataProvider()->changeAttributeValues( changedAttributesMap );
mLayerMutex.unlock(); mLayerMutex.unlock();
mIndexMutex.lock(); mIndexMutex.lock();
mIndex.deleteFeature( feature ); mIndex.deleteFeature( origFeature );
mIndex.insertFeature( feature ); mIndex.insertFeature( feature );
mIndexMutex.unlock(); mIndexMutex.unlock();
} }
void QgsFeaturePool::deleteFeature( QgsFeature &feature ) void QgsFeaturePool::deleteFeature( const QgsFeatureId &fid )
{ {
mIndexMutex.lock(); QgsFeature origFeature;
mIndex.deleteFeature( feature ); if ( get( fid, origFeature ) )
mIndexMutex.unlock(); {
mIndexMutex.lock();
mIndex.deleteFeature( origFeature );
mIndexMutex.unlock();
}
mLayerMutex.lock(); mLayerMutex.lock();
mFeatureCache.remove( feature.id() ); mFeatureCache.remove( origFeature.id() );
mLayer->dataProvider()->deleteFeatures( QgsFeatureIds() << feature.id() ); mLayer->dataProvider()->deleteFeatures( QgsFeatureIds() << fid );
mLayerMutex.unlock(); mLayerMutex.unlock();
} }

View File

@ -36,7 +36,7 @@ class ANALYSIS_EXPORT QgsFeaturePool : public QObject
bool get( QgsFeatureId id, QgsFeature &feature ); bool get( QgsFeatureId id, QgsFeature &feature );
void addFeature( QgsFeature &feature ); void addFeature( QgsFeature &feature );
void updateFeature( QgsFeature &feature ); void updateFeature( QgsFeature &feature );
void deleteFeature( QgsFeature &feature ); void deleteFeature( const QgsFeatureId &fid );
QgsFeatureIds getIntersects( const QgsRectangle &rect ) const; QgsFeatureIds getIntersects( const QgsRectangle &rect ) const;
QgsVectorLayer *getLayer() const { return mLayer; } QgsVectorLayer *getLayer() const { return mLayer; }
const QgsFeatureIds &getFeatureIds() const { return mFeatureIds; } const QgsFeatureIds &getFeatureIds() const { return mFeatureIds; }

View File

@ -185,7 +185,7 @@ void QgsGeometryCheck::deleteFeatureGeometryPart( const QString &layerId, QgsFea
static_cast<QgsGeometryCollection *>( geom )->removeGeometry( partIdx ); static_cast<QgsGeometryCollection *>( geom )->removeGeometry( partIdx );
if ( static_cast<QgsGeometryCollection *>( geom )->numGeometries() == 0 ) if ( static_cast<QgsGeometryCollection *>( geom )->numGeometries() == 0 )
{ {
featurePool->deleteFeature( feature ); featurePool->deleteFeature( feature.id() );
changes[layerId][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) ); changes[layerId][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) );
} }
else else
@ -197,7 +197,7 @@ void QgsGeometryCheck::deleteFeatureGeometryPart( const QString &layerId, QgsFea
} }
else else
{ {
featurePool->deleteFeature( feature ); featurePool->deleteFeature( feature.id() );
changes[layerId][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) ); changes[layerId][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) );
} }
} }

View File

@ -94,7 +94,7 @@ void QgsGeometryContainedCheck::fixError( QgsGeometryCheckError *error, int meth
else if ( method == Delete ) else if ( method == Delete )
{ {
changes[error->layerId()][featureA.id()].append( Change( ChangeFeature, ChangeRemoved ) ); changes[error->layerId()][featureA.id()].append( Change( ChangeFeature, ChangeRemoved ) );
featurePoolA->deleteFeature( featureA ); featurePoolA->deleteFeature( featureA.id() );
error->setFixed( method ); error->setFixed( method );
} }
else else

View File

@ -117,7 +117,7 @@ void QgsGeometryDuplicateCheck::fixError( QgsGeometryCheckError *error, int meth
QgsAbstractGeometry *diffGeom = geomEngineA->symDifference( layerFeatureB.geometry() ); QgsAbstractGeometry *diffGeom = geomEngineA->symDifference( layerFeatureB.geometry() );
if ( diffGeom && diffGeom->isEmpty() ) if ( diffGeom && diffGeom->isEmpty() )
{ {
featurePoolB->deleteFeature( featureB ); featurePoolB->deleteFeature( featureB.id() );
changes[layerIdB][idB].append( Change( ChangeFeature, ChangeRemoved ) ); changes[layerIdB][idB].append( Change( ChangeFeature, ChangeRemoved ) );
} }

View File

@ -64,7 +64,7 @@ void QgsGeometryMultipartCheck::fixError( QgsGeometryCheckError *error, int meth
} }
else if ( method == RemoveObject ) else if ( method == RemoveObject )
{ {
featurePool->deleteFeature( feature ); featurePool->deleteFeature( feature.id() );
error->setFixed( method ); error->setFixed( method );
changes[error->layerId()][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) ); changes[error->layerId()][feature.id()].append( Change( ChangeFeature, ChangeRemoved ) );
} }

View File

@ -132,14 +132,14 @@ void QgsGeometryTypeCheck::fixError( QgsGeometryCheckError *error, int method, c
// Delete feature // Delete feature
else else
{ {
featurePool->deleteFeature( feature ); featurePool->deleteFeature( feature.id() );
changes[error->layerId()][error->featureId()].append( Change( ChangeFeature, ChangeRemoved ) ); changes[error->layerId()][error->featureId()].append( Change( ChangeFeature, ChangeRemoved ) );
} }
error->setFixed( method ); error->setFixed( method );
} }
else if ( method == Delete ) else if ( method == Delete )
{ {
featurePool->deleteFeature( feature ); featurePool->deleteFeature( feature.id() );
error->setFixed( method ); error->setFixed( method );
changes[error->layerId()][error->featureId()].append( Change( ChangeFeature, ChangeRemoved ) ); changes[error->layerId()][error->featureId()].append( Change( ChangeFeature, ChangeRemoved ) );
} }