Skip to content

Commit 120bdb7

Browse files
committed
[Geometry checker] Guard against producing degenerate geometries
1 parent 54e424f commit 120bdb7

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

src/plugins/geometry_checker/checks/qgsgeometryanglecheck.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,16 @@ void QgsGeometryAngleCheck::fixError( QgsGeometryCheckError* error, int method,
114114
}
115115
else if ( method == DeleteNode )
116116
{
117-
118-
if ( n <= 3 )
117+
if ( !QgsGeometryCheckerUtils::canDeleteVertex( geometry, vidx.part, vidx.ring ) )
119118
{
120119
error->setFixFailed( tr( "Resulting geometry is degenerate" ) );
121120
}
121+
else if ( !geometry->deleteVertex( error->vidx() ) )
122+
{
123+
error->setFixFailed( tr( "Failed to delete vertex" ) );
124+
}
122125
else
123126
{
124-
geometry->deleteVertex( vidx );
125127
mFeaturePool->updateFeature( feature );
126128
error->setFixed( method );
127129
changes[error->featureId()].append( Change( ChangeNode, ChangeRemoved, vidx ) );

src/plugins/geometry_checker/checks/qgsgeometryduplicatenodescheck.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,14 @@ void QgsGeometryDuplicateNodesCheck::fixError( QgsGeometryCheckError* error, int
8686
}
8787
else if ( method == RemoveDuplicates )
8888
{
89-
geom->deleteVertex( error->vidx() );
90-
if ( QgsGeometryCheckerUtils::polyLineSize( geom, vidx.part, vidx.ring ) < 3 )
89+
if ( !QgsGeometryCheckerUtils::canDeleteVertex( geom, vidx.part, vidx.ring ) )
9190
{
9291
error->setFixFailed( tr( "Resulting geometry is degenerate" ) );
9392
}
93+
else if ( !geom->deleteVertex( error->vidx() ) )
94+
{
95+
error->setFixFailed( tr( "Failed to delete vertex" ) );
96+
}
9497
else
9598
{
9699
mFeaturePool->updateFeature( feature );

src/plugins/geometry_checker/utils/qgsgeometrycheckerutils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ namespace QgsGeometryCheckerUtils
7272
return ( dx * dx + dy * dy ) < tol * tol;
7373
}
7474

75+
inline bool canDeleteVertex( const QgsAbstractGeometryV2* geom, int iPart, int iRing )
76+
{
77+
int nVerts = geom->vertexCount( iPart, iRing );
78+
QgsPointV2 front = geom->vertexAt( QgsVertexId( iPart, iRing, 0 ) );
79+
QgsPointV2 back = geom->vertexAt( QgsVertexId( iPart, iRing, nVerts - 1 ) );
80+
bool closed = back == front;
81+
return closed ? nVerts > 4 : nVerts > 2;
82+
}
7583
} // QgsGeometryCheckerUtils
7684

7785
#endif // QGS_GEOMETRYCHECKERUTILS_H

0 commit comments

Comments
 (0)