From 03db73d9f19a39d3c6e038936af481b293afcbe4 Mon Sep 17 00:00:00 2001 From: uclaros <Ucla ros 1> Date: Sat, 23 Feb 2019 20:50:52 +0200 Subject: [PATCH] Quick fix for a bug in QgsGeos::reshapeLine that causes QGIS to crash because of an unhandled geos exception. --- src/core/geometry/qgsgeos.cpp | 2 +- tests/src/python/test_qgsgeometry.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/geometry/qgsgeos.cpp b/src/core/geometry/qgsgeos.cpp index 869a900b1e6..b90b3116362 100644 --- a/src/core/geometry/qgsgeos.cpp +++ b/src/core/geometry/qgsgeos.cpp @@ -2344,7 +2344,7 @@ static geos::unique_ptr _mergeLinestrings( const GEOSGeometry *line1, const GEOS return nullptr; bool intersectionAtOrigLineEndpoint = - ( intersectionPoint.x() == x1 && intersectionPoint.y() == y1 ) || + ( intersectionPoint.x() == x1 && intersectionPoint.y() == y1 ) != ( intersectionPoint.x() == x2 && intersectionPoint.y() == y2 ); bool intersectionAtReshapeLineEndpoint = ( intersectionPoint.x() == rx1 && intersectionPoint.y() == ry1 ) || diff --git a/tests/src/python/test_qgsgeometry.py b/tests/src/python/test_qgsgeometry.py index 100c5190b0d..26480a2b054 100644 --- a/tests/src/python/test_qgsgeometry.py +++ b/tests/src/python/test_qgsgeometry.py @@ -2334,6 +2334,18 @@ class TestQgsGeometry(unittest.TestCase): wkt = g.asWkt() assert compareWkt(expWkt, wkt), "testReshape failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt) + # Test reshape a polygon with a line starting or ending at the polygon's first vertex, no change expexted + g = QgsGeometry.fromWkt('Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))') + expWkt = g.asWkt() + g.reshapeGeometry(QgsLineString([QgsPoint(0, 0), QgsPoint(-1, -1)])) + assert compareWkt(g.asWkt(), expWkt), "testReshape failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt) + + # Test reshape a polygon with a line starting or ending at the polygon's first vertex + g = QgsGeometry.fromWkt('Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))') + g.reshapeGeometry(QgsLineString([QgsPoint(0, 0), QgsPoint(0.5, 0.5), QgsPoint(0, 1)])) + expWkt = 'Polygon ((0 0, 1 0, 1 1, 0 1, 0.5 0.5, 0 0))' + assert compareWkt(g.asWkt(), expWkt), "testReshape failed: mismatch Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt) + # Test reshape a line from first/last vertex g = QgsGeometry.fromWkt('LineString (0 0, 5 0, 5 1)') # extend start