Skip to content

Commit f77377e

Browse files
committedOct 18, 2017
Fix crash in QgsGeometry::splitGeometry
1 parent a6ac876 commit f77377e

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed
 

‎src/core/geometry/qgsgeos.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -888,25 +888,19 @@ QgsGeometryEngine::EngineOperationResult QgsGeos::splitPolygonGeometry( GEOSGeom
888888
}
889889
GEOSGeom_destroy_r( geosinit.ctxt, polygons );
890890

891-
bool splitDone = true;
892891
int nGeometriesThis = numberOfGeometries( mGeos ); //original number of geometries
893-
if ( testedGeometries.size() == nGeometriesThis )
894-
{
895-
splitDone = false;
896-
}
897-
898-
mergeGeometriesMultiTypeSplit( testedGeometries );
899-
900-
//no split done, preserve original geometry
901-
if ( !splitDone )
892+
if ( testedGeometries.empty() || testedGeometries.size() == nGeometriesThis )
902893
{
894+
//no split done, preserve original geometry
903895
for ( int i = 0; i < testedGeometries.size(); ++i )
904896
{
905897
GEOSGeom_destroy_r( geosinit.ctxt, testedGeometries[i] );
906898
}
907899
return NothingHappened;
908900
}
909901

902+
mergeGeometriesMultiTypeSplit( testedGeometries );
903+
910904
int i;
911905
for ( i = 0; i < testedGeometries.size() && GEOSisValid_r( geosinit.ctxt, testedGeometries[i] ); ++i )
912906
;

‎tests/src/core/testqgsgeometry.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ class TestQgsGeometry : public QObject
136136
void createCollectionOfType();
137137

138138
void minimalEnclosingCircle( );
139+
void splitGeometry();
139140

140141
private:
141142
//! A helper method to do a render check to see if the geometry op is as expected
@@ -15553,6 +15554,16 @@ void TestQgsGeometry::minimalEnclosingCircle()
1555315554

1555415555
}
1555515556

15557+
void TestQgsGeometry::splitGeometry()
15558+
{
15559+
QgsGeometry g1 = QgsGeometry::fromWkt( QStringLiteral( "Polygon ((492980.38648063864093274 7082334.45244149677455425, 493082.65415841294452548 7082319.87918917648494244, 492980.38648063858272508 7082334.45244149677455425, 492980.38648063864093274 7082334.45244149677455425))" ) );
15560+
QList<QgsGeometry> newGeoms;
15561+
QList<QgsPointXY> testPoints;
15562+
QCOMPARE( g1.splitGeometry( QList< QgsPointXY >() << QgsPointXY( 493825.46541286131832749, 7082214.02779923938214779 ) << QgsPointXY( 492955.04876351181883365, 7082338.06309300474822521 ),
15563+
newGeoms, false, testPoints ), QgsGeometry::NothingHappened );
15564+
QVERIFY( newGeoms.isEmpty() );
15565+
}
15566+
1555615567

1555715568
QGSTEST_MAIN( TestQgsGeometry )
1555815569
#include "testqgsgeometry.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.