Skip to content

Commit 610d99c

Browse files
committed
Fix reverse expression function doesn't handle multicurve geometries
1 parent 0153434 commit 610d99c

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/core/expression/qgsexpressionfunction.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2662,12 +2662,33 @@ static QVariant fcnReverse( const QVariantList &values, const QgsExpressionConte
26622662
if ( fGeom.isNull() )
26632663
return QVariant();
26642664

2665-
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve * >( fGeom.constGet() );
2666-
if ( !curve )
2667-
return QVariant();
2665+
QVariant result;
2666+
if ( !fGeom.isMultipart() )
2667+
{
2668+
const QgsCurve *curve = qgsgeometry_cast<const QgsCurve * >( fGeom.constGet() );
2669+
if ( !curve )
2670+
return QVariant();
26682671

2669-
QgsCurve *reversed = curve->reversed();
2670-
QVariant result = reversed ? QVariant::fromValue( QgsGeometry( reversed ) ) : QVariant();
2672+
QgsCurve *reversed = curve->reversed();
2673+
result = reversed ? QVariant::fromValue( QgsGeometry( reversed ) ) : QVariant();
2674+
}
2675+
else
2676+
{
2677+
const QgsGeometryCollection *collection = qgsgeometry_cast< const QgsGeometryCollection *>( fGeom.constGet() );
2678+
std::unique_ptr< QgsGeometryCollection > reversed( collection->createEmptyWithSameType() );
2679+
for ( int i = 0; i < collection->numGeometries(); ++i )
2680+
{
2681+
if ( const QgsCurve *curve = qgsgeometry_cast<const QgsCurve * >( collection->geometryN( i ) ) )
2682+
{
2683+
reversed->addGeometry( curve->reversed() );
2684+
}
2685+
else
2686+
{
2687+
reversed->addGeometry( collection->geometryN( i )->clone() );
2688+
}
2689+
}
2690+
result = reversed ? QVariant::fromValue( QgsGeometry( std::move( reversed ) ) ) : QVariant();
2691+
}
26712692
return result;
26722693
}
26732694

tests/src/core/testqgsexpression.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,7 @@ class TestQgsExpression: public QObject
851851
QTest::newRow( "reverse point" ) << "reverse(geom_from_wkt('POINT(1 2)'))" << false << QVariant();
852852
QTest::newRow( "reverse polygon" ) << "reverse(geom_from_wkt('POLYGON((-1 -1, 4 0, 4 2, 0 2, -1 -1))'))" << false << QVariant();
853853
QTest::newRow( "reverse line" ) << "geom_to_wkt(reverse(geom_from_wkt('LINESTRING(0 0, 1 1, 2 2)')))" << false << QVariant( "LineString (2 2, 1 1, 0 0)" );
854+
QTest::newRow( "reverse multiline" ) << "geom_to_wkt(reverse(geom_from_wkt('MULTILINESTRING((0 0, 1 1, 2 2),(10 10, 11 11, 12 12))')))" << false << QVariant( "MultiLineString ((2 2, 1 1, 0 0),(12 12, 11 11, 10 10))" );
854855
QTest::newRow( "exterior_ring not geom" ) << "exterior_ring('g')" << true << QVariant();
855856
QTest::newRow( "exterior_ring null" ) << "exterior_ring(NULL)" << false << QVariant();
856857
QTest::newRow( "exterior_ring point" ) << "exterior_ring(geom_from_wkt('POINT(1 2)'))" << false << QVariant();

0 commit comments

Comments
 (0)