Skip to content

Commit defd738

Browse files
author
Hugo Mercier
authored
Merge pull request #3229 from mhugo/fix_15113
Allow curved polygons to be inverted (fixes #15113)
2 parents e6970ba + 8976c9d commit defd738

File tree

6 files changed

+38
-18
lines changed

6 files changed

+38
-18
lines changed

src/core/symbology-ng/qgsinvertedpolygonrenderer.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -288,13 +288,13 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
288288
Q_FOREACH ( QgsGeometry* geom, cit.geometries )
289289
{
290290
QgsMultiPolygon multi;
291-
if (( geom->wkbType() == QGis::WKBPolygon ) ||
292-
( geom->wkbType() == QGis::WKBPolygon25D ) )
291+
QgsWKBTypes::Type type = QgsWKBTypes::flatType( geom->geometry()->wkbType() );
292+
293+
if (( type == QgsWKBTypes::Polygon ) || ( type == QgsWKBTypes::CurvePolygon ) )
293294
{
294295
multi.append( geom->asPolygon() );
295296
}
296-
else if (( geom->wkbType() == QGis::WKBMultiPolygon ) ||
297-
( geom->wkbType() == QGis::WKBMultiPolygon25D ) )
297+
else if (( type == QgsWKBTypes::MultiPolygon ) || ( type == QgsWKBTypes::MultiSurface ) )
298298
{
299299
multi = geom->asMultiPolygon();
300300
}

src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,10 @@ QgsInvertedPolygonRendererWidget::QgsInvertedPolygonRendererWidget( QgsVectorLay
3434
return;
3535
}
3636

37+
QgsWKBTypes::Type type = QgsWKBTypes::singleType( QgsWKBTypes::flatType( QGis::fromOldWkbType( layer->wkbType() ) ) );
38+
3739
// the renderer only applies to polygon vector layers
38-
if ( layer->wkbType() != QGis::WKBPolygon &&
39-
layer->wkbType() != QGis::WKBPolygon25D &&
40-
layer->wkbType() != QGis::WKBMultiPolygon &&
41-
layer->wkbType() != QGis::WKBMultiPolygon25D )
40+
if ( type != QgsWKBTypes::Polygon && type != QgsWKBTypes::CurvePolygon )
4241
{
4342
//setup blank dialog
4443
mRenderer.reset( nullptr );

tests/src/core/testqgsinvertedpolygonrenderer.cpp

+31-10
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ class TestQgsInvertedPolygon : public QObject
5151
void graduatedSubRenderer();
5252
void preprocess();
5353
void projectionTest();
54+
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2
55+
void curvedPolygons();
56+
#endif
5457

5558
private:
5659
bool mTestHasError;
57-
bool setQml( const QString& qmlFile );
60+
bool setQml( QgsVectorLayer* vlayer, const QString& qmlFile );
5861
bool imageCheck( const QString& theType, const QgsRectangle* = 0 );
5962
QgsMapSettings mMapSettings;
6063
QgsVectorLayer * mpPolysLayer;
@@ -93,8 +96,7 @@ void TestQgsInvertedPolygon::initTestCase()
9396
mpPolysLayer->setSimplifyMethod( simplifyMethod );
9497

9598
// Register the layer with the registry
96-
QgsMapLayerRegistry::instance()->addMapLayers(
97-
QList<QgsMapLayer *>() << mpPolysLayer );
99+
QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer *>() << mpPolysLayer );
98100

99101
mMapSettings.setLayers( QStringList() << mpPolysLayer->id() );
100102
mReport += "<h1>Inverted Polygon Renderer Tests</h1>\n";
@@ -117,22 +119,22 @@ void TestQgsInvertedPolygon::cleanupTestCase()
117119
void TestQgsInvertedPolygon::singleSubRenderer()
118120
{
119121
mReport += "<h2>Inverted polygon renderer, single sub renderer test</h2>\n";
120-
QVERIFY( setQml( "inverted_polys_single.qml" ) );
122+
QVERIFY( setQml( mpPolysLayer, "inverted_polys_single.qml" ) );
121123
QVERIFY( imageCheck( "inverted_polys_single" ) );
122124
}
123125

124126
void TestQgsInvertedPolygon::graduatedSubRenderer()
125127
{
126128
mReport += "<h2>Inverted polygon renderer, graduated sub renderer test</h2>\n";
127-
QVERIFY( setQml( "inverted_polys_graduated.qml" ) );
129+
QVERIFY( setQml( mpPolysLayer, "inverted_polys_graduated.qml" ) );
128130
QVERIFY( imageCheck( "inverted_polys_graduated" ) );
129131
}
130132

131133
void TestQgsInvertedPolygon::preprocess()
132134
{
133135
// FIXME will have to find some overlapping polygons
134136
mReport += "<h2>Inverted polygon renderer, preprocessing test</h2>\n";
135-
QVERIFY( setQml( "inverted_polys_preprocess.qml" ) );
137+
QVERIFY( setQml( mpPolysLayer, "inverted_polys_preprocess.qml" ) );
136138
QVERIFY( imageCheck( "inverted_polys_preprocess" ) );
137139
}
138140

@@ -142,25 +144,44 @@ void TestQgsInvertedPolygon::projectionTest()
142144
mMapSettings.setDestinationCrs( QgsCoordinateReferenceSystem( "EPSG:2154" ) );
143145
mMapSettings.setCrsTransformEnabled( true );
144146
QgsRectangle extent( QgsPoint( -8639421, 8382691 ), QgsPoint( -3969110, 12570905 ) );
145-
QVERIFY( setQml( "inverted_polys_single.qml" ) );
147+
QVERIFY( setQml( mpPolysLayer, "inverted_polys_single.qml" ) );
146148
QVERIFY( imageCheck( "inverted_polys_projection", &extent ) );
147-
QVERIFY( setQml( "inverted_polys_preprocess.qml" ) );
149+
QVERIFY( setQml( mpPolysLayer, "inverted_polys_preprocess.qml" ) );
148150
QVERIFY( imageCheck( "inverted_polys_projection2", &extent ) );
149151
mMapSettings.setCrsTransformEnabled( false );
150152
}
151153

154+
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_MAJOR >= 2
155+
// This test relies on GDAL support of curved polygons
156+
void TestQgsInvertedPolygon::curvedPolygons()
157+
{
158+
QString myCurvedPolysFileName = mTestDataDir + "curved_polys.gpkg";
159+
QFileInfo myCurvedPolyFileInfo( myCurvedPolysFileName );
160+
QgsVectorLayer* curvedLayer = new QgsVectorLayer( myCurvedPolyFileInfo.filePath() + "|layername=polys",
161+
myCurvedPolyFileInfo.completeBaseName(), "ogr" );
162+
curvedLayer->setSimplifyMethod( simplifyMethod );
163+
QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer *>() << curvedLayer );
164+
165+
mReport += "<h2>Inverted polygon renderer, curved polygons test</h2>\n";
166+
mMapSettings.setLayers( QStringList() << curvedLayer->id() );
167+
QVERIFY( setQml( mpCurvedPolysLayer, "inverted_polys_single.qml" ) );
168+
QVERIFY( imageCheck( "inverted_polys_curved" ) );
169+
mMapSettings.setLayers( QStringList() << curvedLayer->id() );
170+
}
171+
#endif
172+
152173
//
153174
// Private helper functions not called directly by CTest
154175
//
155176

156-
bool TestQgsInvertedPolygon::setQml( const QString& qmlFile )
177+
bool TestQgsInvertedPolygon::setQml( QgsVectorLayer* vlayer, const QString& qmlFile )
157178
{
158179
//load a qml style and apply to our layer
159180
//the style will correspond to the renderer
160181
//type we are testing
161182
bool myStyleFlag = false;
162183
QString myFileName = mTestDataDir + qmlFile;
163-
QString error = mpPolysLayer->loadNamedStyle( myFileName, myStyleFlag );
184+
QString error = vlayer->loadNamedStyle( myFileName, myStyleFlag );
164185
if ( !myStyleFlag )
165186
{
166187
qDebug( "%s", error.toLocal8Bit().constData() );

tests/testdata/curved_polys.gpkg

44 KB
Binary file not shown.

0 commit comments

Comments
 (0)