Skip to content

Commit c49a18c

Browse files
Roelm-kuhn
authored andcommittedMay 31, 2018
Add support for reading SLD's with multiple FeatureTypeStyle elements.
Introduce a virtual FeatureTypeStyle to add support for reading SLD documents with more than one FeatureTypeStyle element. Still supports SLD's with one FeatureTypeStyle, as well as SLD's with multiple FeatureTypeStyles, including empty FeatureTypeStyles (not breaking single symbol rendering in that case). Complies with SLD's painter's model for rendering, appending Rules from subsequent FeatureTypeStyles in order. Fix #6413 (http://hub.qgis.org/issues/6413)
1 parent 8cf7447 commit c49a18c

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed
 

‎src/core/symbology/qgsrenderer.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -223,47 +223,51 @@ QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTyp
223223
return nullptr;
224224
}
225225

226+
// create empty FeatureTypeStyle element to merge Rule's from all FeatureTypeStyle's
227+
QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode( false ).toElement();
228+
226229
// use the RuleRenderer when more rules are present or the rule
227230
// has filters or min/max scale denominators set,
228231
// otherwise use the SingleSymbol renderer
229232
bool needRuleRenderer = false;
230233
int ruleCount = 0;
231234

232-
QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( "Rule" ) );
233-
while ( !ruleElem.isNull() )
235+
while ( !featTypeStyleElem.isNull() )
234236
{
235-
ruleCount++;
236-
237-
// more rules present, use the RuleRenderer
238-
if ( ruleCount > 1 )
237+
QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral( "Rule" ) );
238+
while ( !ruleElem.isNull() )
239239
{
240-
QgsDebugMsg( "more Rule elements found: need a RuleRenderer" );
241-
needRuleRenderer = true;
242-
break;
243-
}
240+
ruleCount++;
244241

245-
QDomElement ruleChildElem = ruleElem.firstChildElement();
246-
while ( !ruleChildElem.isNull() )
247-
{
248-
// rule has filter or min/max scale denominator, use the RuleRenderer
249-
if ( ruleChildElem.localName() == QLatin1String( "Filter" ) ||
250-
ruleChildElem.localName() == QLatin1String( "MinScaleDenominator" ) ||
251-
ruleChildElem.localName() == QLatin1String( "MaxScaleDenominator" ) )
242+
// append a clone of all Rules to the merged FeatureTypeStyle element
243+
mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
244+
// more rules present, use the RuleRenderer
245+
246+
if ( ruleCount > 1 )
252247
{
253-
QgsDebugMsg( "Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" );
248+
QgsDebugMsg( "more Rule elements found: need a RuleRenderer" );
254249
needRuleRenderer = true;
255-
break;
256250
}
257251

258-
ruleChildElem = ruleChildElem.nextSiblingElement();
259-
}
252+
QDomElement ruleChildElem = ruleElem.firstChildElement();
253+
while ( !ruleChildElem.isNull() )
254+
{
255+
// rule has filter or min/max scale denominator, use the RuleRenderer
256+
if ( ruleChildElem.localName() == QLatin1String( "Filter" ) ||
257+
ruleChildElem.localName() == QLatin1String( "MinScaleDenominator" ) ||
258+
ruleChildElem.localName() == QLatin1String( "MaxScaleDenominator" ) )
259+
{
260+
QgsDebugMsg( "Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" );
261+
needRuleRenderer = true;
262+
break;
263+
}
264+
265+
ruleChildElem = ruleChildElem.nextSiblingElement();
266+
}
260267

261-
if ( needRuleRenderer )
262-
{
263-
break;
268+
ruleElem = ruleElem.nextSiblingElement( QStringLiteral( "Rule" ) );
264269
}
265-
266-
ruleElem = ruleElem.nextSiblingElement( QStringLiteral( "Rule" ) );
270+
featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral( "FeatureTypeStyle" ) );
267271
}
268272

269273
QString rendererType;
@@ -285,7 +289,7 @@ QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTyp
285289
return nullptr;
286290
}
287291

288-
QgsFeatureRenderer *r = m->createRendererFromSld( featTypeStyleElem, geomType );
292+
QgsFeatureRenderer *r = m->createRendererFromSld( mergedFeatTypeStyle, geomType );
289293
return r;
290294
}
291295

0 commit comments

Comments
 (0)
Please sign in to comment.