@@ -2152,6 +2152,16 @@ void TestQgsGeometry::polygonV2()
2152
2152
// retrieve exterior ring and check
2153
2153
QCOMPARE ( *( static_cast < QgsLineStringV2* >( p1.exteriorRing () ) ), *ext );
2154
2154
2155
+ // test that a non closed exterior ring will be automatically closed
2156
+ ext = new QgsLineStringV2 ();
2157
+ ext->setPoints ( QList< QgsPointV2 >() << QgsPointV2 ( 0 , 0 ) << QgsPointV2 ( 0 , 10 ) << QgsPointV2 ( 10 , 10 )
2158
+ << QgsPointV2 ( 10 , 0 ) );
2159
+ QVERIFY ( !ext->isClosed () );
2160
+ p1.setExteriorRing ( ext );
2161
+ QVERIFY ( !p1.isEmpty () );
2162
+ QVERIFY ( p1.exteriorRing ()->isClosed () );
2163
+ QCOMPARE ( p1.nCoordinates (), 5 );
2164
+
2155
2165
// initial setting of exterior ring should set z/m type
2156
2166
QgsPolygonV2 p2;
2157
2167
ext = new QgsLineStringV2 ();
@@ -2228,35 +2238,44 @@ void TestQgsGeometry::polygonV2()
2228
2238
QCOMPARE ( p6.interiorRing ( 0 ), ring );
2229
2239
QVERIFY ( !p6.interiorRing ( 1 ) );
2230
2240
2241
+ // add non-closed interior ring, should be closed automatically
2242
+ ring = new QgsLineStringV2 ();
2243
+ ring->setPoints ( QList< QgsPointV2 >() << QgsPointV2 ( 0.1 , 0.1 ) << QgsPointV2 ( 0.1 , 0.9 ) << QgsPointV2 ( 0.9 , 0.9 )
2244
+ << QgsPointV2 ( 0.9 , 0.1 ) );
2245
+ QVERIFY ( !ring->isClosed () );
2246
+ p6.addInteriorRing ( ring );
2247
+ QCOMPARE ( p6.numInteriorRings (), 2 );
2248
+ QVERIFY ( p6.interiorRing ( 1 )->isClosed () );
2249
+
2231
2250
// try adding an interior ring with z to a 2d polygon, z should be dropped
2232
2251
ring = new QgsLineStringV2 ();
2233
2252
ring->setPoints ( QList< QgsPointV2 >() << QgsPointV2 ( QgsWKBTypes::PointZ, 0.1 , 0.1 , 1 )
2234
2253
<< QgsPointV2 ( QgsWKBTypes::PointZ, 0.1 , 0.2 , 2 ) << QgsPointV2 ( QgsWKBTypes::PointZ, 0.2 , 0.2 , 3 )
2235
2254
<< QgsPointV2 ( QgsWKBTypes::PointZ, 0.2 , 0.1 , 4 ) << QgsPointV2 ( QgsWKBTypes::PointZ, 0.1 , 0.1 , 1 ) );
2236
2255
p6.addInteriorRing ( ring );
2237
- QCOMPARE ( p6.numInteriorRings (), 2 );
2256
+ QCOMPARE ( p6.numInteriorRings (), 3 );
2238
2257
QVERIFY ( !p6.is3D () );
2239
2258
QVERIFY ( !p6.isMeasure () );
2240
2259
QCOMPARE ( p6.wkbType (), QgsWKBTypes::Polygon );
2241
- QVERIFY ( p6.interiorRing ( 1 ) );
2242
- QVERIFY ( !p6.interiorRing ( 1 )->is3D () );
2243
- QVERIFY ( !p6.interiorRing ( 1 )->isMeasure () );
2244
- QCOMPARE ( p6.interiorRing ( 1 )->wkbType (), QgsWKBTypes::LineString );
2260
+ QVERIFY ( p6.interiorRing ( 2 ) );
2261
+ QVERIFY ( !p6.interiorRing ( 2 )->is3D () );
2262
+ QVERIFY ( !p6.interiorRing ( 2 )->isMeasure () );
2263
+ QCOMPARE ( p6.interiorRing ( 2 )->wkbType (), QgsWKBTypes::LineString );
2245
2264
2246
2265
// try adding an interior ring with m to a 2d polygon, m should be dropped
2247
2266
ring = new QgsLineStringV2 ();
2248
2267
ring->setPoints ( QList< QgsPointV2 >() << QgsPointV2 ( QgsWKBTypes::PointM, 0.1 , 0.1 , 0 , 1 )
2249
2268
<< QgsPointV2 ( QgsWKBTypes::PointM, 0.1 , 0.2 , 0 , 2 ) << QgsPointV2 ( QgsWKBTypes::PointM, 0.2 , 0.2 , 0 , 3 )
2250
2269
<< QgsPointV2 ( QgsWKBTypes::PointM, 0.2 , 0.1 , 0 , 4 ) << QgsPointV2 ( QgsWKBTypes::PointM, 0.1 , 0.1 , 0 , 1 ) );
2251
2270
p6.addInteriorRing ( ring );
2252
- QCOMPARE ( p6.numInteriorRings (), 3 );
2271
+ QCOMPARE ( p6.numInteriorRings (), 4 );
2253
2272
QVERIFY ( !p6.is3D () );
2254
2273
QVERIFY ( !p6.isMeasure () );
2255
2274
QCOMPARE ( p6.wkbType (), QgsWKBTypes::Polygon );
2256
- QVERIFY ( p6.interiorRing ( 2 ) );
2257
- QVERIFY ( !p6.interiorRing ( 2 )->is3D () );
2258
- QVERIFY ( !p6.interiorRing ( 2 )->isMeasure () );
2259
- QCOMPARE ( p6.interiorRing ( 2 )->wkbType (), QgsWKBTypes::LineString );
2275
+ QVERIFY ( p6.interiorRing ( 3 ) );
2276
+ QVERIFY ( !p6.interiorRing ( 3 )->is3D () );
2277
+ QVERIFY ( !p6.interiorRing ( 3 )->isMeasure () );
2278
+ QCOMPARE ( p6.interiorRing ( 3 )->wkbType (), QgsWKBTypes::LineString );
2260
2279
2261
2280
// addInteriorRing without z/m to PolygonZM
2262
2281
QgsPolygonV2 p6b;
0 commit comments