QgsAbstractGeometry* QgsMultiPolygonV2::boundary() const { QgsMultiLineString* multiLine = new QgsMultiLineString(); for ( int i = 0; i < mGeometries.size(); ++i ) { if ( QgsPolygonV2* polygon = dynamic_cast<QgsPolygonV2*>( mGeometries.at( i ) ) ) { QgsAbstractGeometry* polygonBoundary = polygon->boundary(); if ( QgsLineString* lineStringBoundary = dynamic_cast< QgsLineString* >( polygonBoundary ) ) { multiLine->addGeometry( lineStringBoundary ); } else if ( QgsMultiLineString* multiLineStringBoundary = dynamic_cast< QgsMultiLineString* >( polygonBoundary ) ) { for ( int j = 0; j < multiLineStringBoundary->numGeometries(); ++j ) { multiLine->addGeometry( multiLineStringBoundary->geometryN( j )->clone() ); } delete multiLineStringBoundary; } else { delete polygonBoundary; } } } if ( multiLine->numGeometries() == 0 ) { delete multiLine; return nullptr; } return multiLine; }
QgsAbstractGeometry *QgsPolygonV2::boundary() const { if ( !mExteriorRing ) return nullptr; if ( mInteriorRings.isEmpty() ) { return mExteriorRing->clone(); } else { QgsMultiLineString *multiLine = new QgsMultiLineString(); multiLine->addGeometry( mExteriorRing->clone() ); int nInteriorRings = mInteriorRings.size(); for ( int i = 0; i < nInteriorRings; ++i ) { multiLine->addGeometry( mInteriorRings.at( i )->clone() ); } return multiLine; } }