Skip to content

Commit 0389ebe

Browse files
committedJun 16, 2019
Fix collecting geometries when one of the added geometries is already multi-part
Fixes #30208
1 parent b8dcafb commit 0389ebe

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed
 

‎src/core/geometry/qgsgeometry.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,17 @@ QgsGeometry QgsGeometry::collectGeometry( const QVector< QgsGeometry > &geometri
254254
}
255255
else
256256
{
257-
collected.addPart( g );
257+
if ( g.isMultipart() )
258+
{
259+
for ( auto p = g.const_parts_begin(); p != g.const_parts_end(); ++p )
260+
{
261+
collected.addPart( ( *p )->clone() );
262+
}
263+
}
264+
else
265+
{
266+
collected.addPart( g );
267+
}
258268
}
259269
}
260270
return collected;

‎tests/src/python/test_qgsgeometry.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,6 +1985,31 @@ def testCollectGeometry(self):
19851985
wkt = geometry.asWkt()
19861986
assert compareWkt(expwkt, wkt), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt)
19871987

1988+
# collect some geometries which are already multipart
1989+
geometries = [QgsGeometry.fromWkt('LineString( 0 0, 1 1)'), QgsGeometry.fromWkt('MultiLineString((2 2, 3 3),(4 4, 5 5))')]
1990+
geometry = QgsGeometry.collectGeometry(geometries)
1991+
expwkt = "MultiLineString ((0 0, 1 1),(2 2, 3 3),(4 4, 5 5))"
1992+
wkt = geometry.asWkt()
1993+
assert compareWkt(expwkt, wkt), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt)
1994+
1995+
geometries = [QgsGeometry.fromWkt('MultiLineString((2 2, 3 3),(4 4, 5 5))'), QgsGeometry.fromWkt('LineString( 0 0, 1 1)')]
1996+
geometry = QgsGeometry.collectGeometry(geometries)
1997+
expwkt = "MultiLineString ((2 2, 3 3),(4 4, 5 5),(0 0, 1 1))"
1998+
wkt = geometry.asWkt()
1999+
assert compareWkt(expwkt, wkt), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt)
2000+
2001+
geometries = [QgsGeometry.fromWkt('Polygon((100 100, 101 100, 101 101, 100 100))'), QgsGeometry.fromWkt('MultiPolygon (((0 0, 1 0, 1 1, 0 1, 0 0)),((2 0, 3 0, 3 1, 2 1, 2 0)))')]
2002+
geometry = QgsGeometry.collectGeometry(geometries)
2003+
expwkt = "MultiPolygon (((100 100, 101 100, 101 101, 100 100)),((0 0, 1 0, 1 1, 0 1, 0 0)),((2 0, 3 0, 3 1, 2 1, 2 0)))"
2004+
wkt = geometry.asWkt()
2005+
assert compareWkt(expwkt, wkt), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt)
2006+
2007+
geometries = [QgsGeometry.fromWkt('MultiPolygon (((0 0, 1 0, 1 1, 0 1, 0 0)),((2 0, 3 0, 3 1, 2 1, 2 0)))'), QgsGeometry.fromWkt('Polygon((100 100, 101 100, 101 101, 100 100))')]
2008+
geometry = QgsGeometry.collectGeometry(geometries)
2009+
expwkt = "MultiPolygon (((0 0, 1 0, 1 1, 0 1, 0 0)),((2 0, 3 0, 3 1, 2 1, 2 0)),((100 100, 101 100, 101 101, 100 100)))"
2010+
wkt = geometry.asWkt()
2011+
assert compareWkt(expwkt, wkt), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt)
2012+
19882013
# test empty list
19892014
geometries = []
19902015
geometry = QgsGeometry.collectGeometry(geometries)

0 commit comments

Comments
 (0)
Please sign in to comment.