Skip to content
Permalink
Browse files

do not convert multiline to multipolygon if one of the part failed, a…

…lso consider case of 3 vertices line with first and last vertex identical
  • Loading branch information
3nids committed Mar 3, 2014
1 parent f538c8b commit 1d8faf2021378b0e32a10bf6063ecad6551ea1c3
Showing with 26 additions and 17 deletions.
  1. +19 −16 src/core/qgsgeometry.cpp
  2. +7 −1 tests/src/python/test_qgsgeometry.py
@@ -6227,9 +6227,10 @@ QgsGeometry* QgsGeometry::convertToPolygon( bool destMultipart )
for ( QgsMultiPolyline::iterator multiLineIt = multiLine.begin(); multiLineIt != multiLine.end(); ++multiLineIt )
{
// do not create polygon for a 1 segment line
// this does not consider the special case where line has 2 segments with first and last node identical
if (( *multiLineIt ).count() < 3 )
continue;
return 0;
if (( *multiLineIt ).count() == 3 && ( *multiLineIt ).first() == ( *multiLineIt ).last() )
return 0;

// add closing node
if (( *multiLineIt ).first() != ( *multiLineIt ).last() )
@@ -6256,21 +6257,23 @@ QgsGeometry* QgsGeometry::convertToPolygon( bool destMultipart )
QgsPolyline line = asPolyline();

// do not create polygon for a 1 segment line
if ( line.count() >= 3 )
{
// add closing node
if ( line.first() != line.last() )
line << line.first();
if ( line.count() < 3 )
return 0;
if ( line.count() == 3 && line.first() == line.last() )
return 0;

// destination is multipart
if ( destMultipart )
{
return fromMultiPolygon( QgsMultiPolygon() << ( QgsPolygon() << line ) );
}
else
{
return fromPolygon( QgsPolygon() << line );
}
// add closing node
if ( line.first() != line.last() )
line << line.first();

// destination is multipart
if ( destMultipart )
{
return fromMultiPolygon( QgsMultiPolygon() << ( QgsPolygon() << line ) );
}
else
{
return fromPolygon( QgsPolygon() << line );
}
}
return 0;
@@ -1194,7 +1194,7 @@ def testConvertToType(self):
######## TO LINE ########
# POINT TO LINE
point = QgsGeometry.fromPoint(QgsPoint(1,1))
assert point.convertToType(QGis.Line, False) !=0 , "convertToType with a point should return a null geometry"
assert point.convertToType(QGis.Line, False) is None , "convertToType with a point should return a null geometry"
# MULTIPOINT TO LINE
multipoint = QgsGeometry.fromMultiPoint(points[0][0])
wkt = multipoint.convertToType(QGis.Line, False).exportToWkt()
@@ -1258,6 +1258,12 @@ def testConvertToType(self):
wkt = line.convertToType(QGis.Polygon, False).exportToWkt()
expWkt = "POLYGON((0 0,1 0,1 1,2 1,2 2,0 2,0 0))"
assert compareWkt( expWkt, wkt ), "convertToType failed: from line to polygon. Expected:\n%s\nGot:\n%s\n" % (expWkt, wkt )
# LINE ( 3 vertices, with first = last ) TO POLYGON
line = QgsGeometry.fromPolyline([QgsPoint(1,1),QgsPoint(0,0),QgsPoint(1,1)])
assert line.convertToType(QGis.Polygon, False) is None , "convertToType to polygon of a 3 vertices lines with first and last vertex identical should return a null geometry"
# MULTILINE ( with a part of 3 vertices, with first = last ) TO MULTIPOLYGON
multiline = QgsGeometry.fromMultiPolyline([points[0][0],[QgsPoint(1,1),QgsPoint(0,0),QgsPoint(1,1)]])
assert multiline.convertToType(QGis.Polygon, True) is None , "convertToType to polygon of a 3 vertices lines with first and last vertex identical should return a null geometry"
# LINE TO MULTIPOLYGON
line = QgsGeometry.fromPolyline(points[0][0])
wkt = line.convertToType(QGis.Polygon, True).exportToWkt()

0 comments on commit 1d8faf2

Please sign in to comment.
You can’t perform that action at this time.