mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-27 00:03:38 -04:00
[Geometry checker] Fix features not correctly removed from QgsFeaturePool spatial index
This commit is contained in:
parent
084660a47f
commit
efc00c38a1
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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; }
|
||||||
|
@ -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 ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 ) );
|
||||||
}
|
}
|
||||||
|
@ -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 ) );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user