@@ -1134,6 +1134,15 @@ void TestQgsGeometry::point()
11341134 QCOMPARE( p.z(), 3.3 );
11351135 QCOMPARE( p.m(), 4.4 );
11361136 QCOMPARE( p.wkbType(), QgsWkbTypes::PointZM );
1137+
1138+ // filter vertex
1139+ p = QgsPoint( 1.1, 2.2, 3.3, 4.4, QgsWkbTypes::PointZM );
1140+ p.filterVertices( []( const QgsPoint & )-> bool { return false; } );
1141+ QCOMPARE( p.x(), 1.1 );
1142+ QCOMPARE( p.y(), 2.2 );
1143+ QCOMPARE( p.z(), 3.3 );
1144+ QCOMPARE( p.m(), 4.4 );
1145+ QCOMPARE( p.wkbType(), QgsWkbTypes::PointZM );
11371146}
11381147
11391148void TestQgsGeometry::circularString()
@@ -2608,6 +2617,17 @@ void TestQgsGeometry::circularString()
26082617 swapLine.setPoints( QgsPointSequence() << QgsPoint( 11, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 11, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 111, 12, 23, 24, QgsWkbTypes::PointZM ) );
26092618 swapLine.swapXy();
26102619 QCOMPARE( swapLine.asWkt(), QStringLiteral( "CircularStringZM (2 11 3 4, 12 11 13 14, 12 111 23 24)" ) );
2620+
2621+ // filter vertex
2622+ QgsCircularString filterLine;
2623+ auto filter = []( const QgsPoint & point )-> bool
2624+ {
2625+ return point.x() < 5;
2626+ };
2627+ filterLine.filterVertices( filter ); // no crash
2628+ filterLine.setPoints( QgsPointSequence() << QgsPoint( 1, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 4, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 111, 12, 23, 24, QgsWkbTypes::PointZM ) );
2629+ filterLine.filterVertices( filter );
2630+ QCOMPARE( filterLine.asWkt( 2 ), QStringLiteral( "CircularStringZM (1 2 3 4, 4 12 13 14)" ) );
26112631}
26122632
26132633
@@ -4508,6 +4528,17 @@ void TestQgsGeometry::lineString()
45084528 swapLine.setPoints( QgsPointSequence() << QgsPoint( 11, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 11, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 111, 12, 23, 24, QgsWkbTypes::PointZM ) );
45094529 swapLine.swapXy();
45104530 QCOMPARE( swapLine.asWkt( 2 ), QStringLiteral( "LineStringZM (2 11 3 4, 12 11 13 14, 12 111 23 24)" ) );
4531+
4532+ // filter vertex
4533+ QgsLineString filterLine;
4534+ auto filter = []( const QgsPoint & point )-> bool
4535+ {
4536+ return point.x() < 5;
4537+ };
4538+ filterLine.filterVertices( filter ); // no crash
4539+ filterLine.setPoints( QgsPointSequence() << QgsPoint( 11, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 1, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 4, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 111, 12, 23, 24, QgsWkbTypes::PointZM ) );
4540+ filterLine.filterVertices( filter );
4541+ QCOMPARE( swapLine.asWkt( 2 ), QStringLiteral( "LineStringZM (2 11 3 4, 12 11 13 14, 12 111 23 24)" ) );
45114542}
45124543
45134544void TestQgsGeometry::polygon()
@@ -6268,6 +6299,25 @@ void TestQgsGeometry::polygon()
62686299 swapPolygon.addInteriorRing( swapLine.clone() );
62696300 swapPolygon.swapXy();
62706301 QCOMPARE( swapPolygon.asWkt( 2 ), QStringLiteral( "PolygonZM ((11 2 3 4, 11 12 13 14, 11 22 23 24, 11 2 3 4),(2 1 5 6, 2.01 11.01 15 16, 2.01 11 25 26, 2 11 5 6, 2 1 5 6))" ) );
6302+
6303+ // filter vertex
6304+ QgsPolygon filterPolygon;
6305+ auto filter = []( const QgsPoint & point )-> bool
6306+ {
6307+ return point.x() > 5;
6308+ };
6309+ filterPolygon.filterVertices( filter ); // no crash
6310+ QgsLineString filterPolygonRing;
6311+ filterPolygonRing.setPoints( QgsPointSequence() << QgsPoint( 11, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 4, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 11, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 11, 22, 23, 24, QgsWkbTypes::PointZM ) << QgsPoint( 11, 2, 3, 4, QgsWkbTypes::PointZM ) );
6312+ filterPolygon.setExteriorRing( filterPolygonRing.clone() );
6313+ filterPolygon.filterVertices( filter );
6314+ QCOMPARE( filterPolygon.asWkt(), QStringLiteral( "PolygonZM ((11 2 3 4, 11 12 13 14, 11 22 23 24, 11 2 3 4))" ) );
6315+ filterPolygonRing.setPoints( QgsPointSequence() << QgsPoint( 10, 2, 5, 6, QgsWkbTypes::PointZM ) << QgsPoint( 4, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 11.01, 2.01, 15, 16, QgsWkbTypes::PointZM ) << QgsPoint( 11, 2.01, 25, 26, QgsWkbTypes::PointZM ) << QgsPoint( 11, 2, 5, 6, QgsWkbTypes::PointZM ) << QgsPoint( 10, 2, 5, 6, QgsWkbTypes::PointZM ) );
6316+ filterPolygon.addInteriorRing( filterPolygonRing.clone() );
6317+ filterPolygonRing.setPoints( QgsPointSequence() << QgsPoint( 1, 2, 5, 6, QgsWkbTypes::PointZM ) << QgsPoint( 11.01, 2.01, 15, 16, QgsWkbTypes::PointZM ) << QgsPoint( 11, 2.01, 25, 26, QgsWkbTypes::PointZM ) << QgsPoint( 1, 2, 5, 6, QgsWkbTypes::PointZM ) );
6318+ filterPolygon.addInteriorRing( filterPolygonRing.clone() );
6319+ filterPolygon.filterVertices( filter );
6320+ QCOMPARE( filterPolygon.asWkt( 2 ), QStringLiteral( "PolygonZM ((11 2 3 4, 11 12 13 14, 11 22 23 24, 11 2 3 4),(10 2 5 6, 11.01 2.01 15 16, 11 2.01 25 26, 11 2 5 6, 10 2 5 6))" ) );
62716321}
62726322
62736323void TestQgsGeometry::triangle()
@@ -11037,6 +11087,23 @@ void TestQgsGeometry::compoundCurve()
1103711087 swapCurve.swapXy();
1103811088 QCOMPARE( swapCurve.asWkt(), QStringLiteral( "CompoundCurveZM (CircularStringZM (11 2 3 4, 11 12 13 14, 111 12 23 24),(111 12 23 24, 122 22 33 34))" ) );
1103911089
11090+ // filter vertices
11091+ auto filter = []( const QgsPoint & point )-> bool
11092+ {
11093+ return point.x() > 5;
11094+ };
11095+ QgsCompoundCurve filterCurve;
11096+ filterCurve.filterVertices( filter ); //no crash
11097+ nodeLine.setPoints( QgsPointSequence() << QgsPoint( 1, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 11, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 11, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 111, 12, 23, 24, QgsWkbTypes::PointZM ) << QgsPoint( 1, 2, 3, 4, QgsWkbTypes::PointZM ) );
11098+ filterCurve.addCurve( nodeLine.clone() );
11099+ filterCurve.filterVertices( filter );
11100+ QCOMPARE( filterCurve.asWkt(), QStringLiteral( "CompoundCurveZM (CircularStringZM (11 2 3 4, 11 12 13 14, 111 12 23 24))" ) );
11101+ QgsLineString lsFilter;
11102+ lsFilter.setPoints( QgsPointSequence() << QgsPoint( 12, 111, 23, 24, QgsWkbTypes::PointZM ) << QgsPoint( 22, 122, 33, 34, QgsWkbTypes::PointZM ) << QgsPoint( 1, 111, 23, 24, QgsWkbTypes::PointZM ) );
11103+ filterCurve.addCurve( lsFilter.clone() );
11104+ filterCurve.filterVertices( filter );
11105+ QCOMPARE( filterCurve.asWkt(), QStringLiteral( "CompoundCurveZM (CircularStringZM (11 2 3 4, 11 12 13 14, 111 12 23 24),(12 111 23 24, 22 122 33 34))" ) );
11106+
1104011107}
1104111108
1104211109void TestQgsGeometry::multiPoint()
@@ -15427,6 +15494,23 @@ void TestQgsGeometry::geometryCollection()
1542715494 swapCollect.addGeometry( swapLine.clone() );
1542815495 swapCollect.swapXy();
1542915496 QCOMPARE( swapCollect.asWkt( 2 ), QStringLiteral( "GeometryCollection (LineStringZM (11 2 3 4, 11 12 13 14, 111 12 23 24),LineStringZM (2 11 5 6, 1.99 11.01 15 16, 2.01 11.02 25 26))" ) );
15497+
15498+ // filter vertices
15499+ QgsGeometryCollection filterCollect;
15500+ auto filter = []( const QgsPoint & point )-> bool
15501+ {
15502+ return point.x() > 5;
15503+ };
15504+ QgsLineString filterLine;
15505+ filterCollect.filterVertices( filter ); // no crash
15506+ filterLine.setPoints( QgsPointSequence() << QgsPoint( 1, 2, 3, 4, QgsWkbTypes::PointZM ) << QgsPoint( 11, 12, 13, 14, QgsWkbTypes::PointZM ) << QgsPoint( 111, 12, 23, 24, QgsWkbTypes::PointZM ) );
15507+ filterCollect.addGeometry( filterLine.clone() );
15508+ filterCollect.filterVertices( filter );
15509+ QCOMPARE( filterCollect.asWkt(), QStringLiteral( "GeometryCollection (LineStringZM (11 12 13 14, 111 12 23 24))" ) );
15510+ filterLine.setPoints( QgsPointSequence() << QgsPoint( 11, 2, 5, 6, QgsWkbTypes::PointZM ) << QgsPoint( 1.01, 1.99, 15, 16, QgsWkbTypes::PointZM ) << QgsPoint( 11.02, 2.01, 25, 26, QgsWkbTypes::PointZM ) );
15511+ filterCollect.addGeometry( filterLine.clone() );
15512+ filterCollect.filterVertices( filter );
15513+ QCOMPARE( filterCollect.asWkt( 2 ), QStringLiteral( "GeometryCollection (LineStringZM (11 12 13 14, 111 12 23 24),LineStringZM (11 2 5 6, 11.02 2.01 25 26))" ) );
1543015514}
1543115515
1543215516void TestQgsGeometry::fromQgsPointXY()
0 commit comments