@@ -223,47 +223,51 @@ QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTyp
223
223
return nullptr ;
224
224
}
225
225
226
+ // create empty FeatureTypeStyle element to merge Rule's from all FeatureTypeStyle's
227
+ QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode ( false ).toElement ();
228
+
226
229
// use the RuleRenderer when more rules are present or the rule
227
230
// has filters or min/max scale denominators set,
228
231
// otherwise use the SingleSymbol renderer
229
232
bool needRuleRenderer = false ;
230
233
int ruleCount = 0 ;
231
234
232
- QDomElement ruleElem = featTypeStyleElem.firstChildElement ( QStringLiteral ( " Rule" ) );
233
- while ( !ruleElem.isNull () )
235
+ while ( !featTypeStyleElem.isNull () )
234
236
{
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 () )
239
239
{
240
- QgsDebugMsg ( " more Rule elements found: need a RuleRenderer" );
241
- needRuleRenderer = true ;
242
- break ;
243
- }
240
+ ruleCount++;
244
241
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 )
252
247
{
253
- QgsDebugMsg ( " Filter or Min/MaxScaleDenominator element found: need a RuleRenderer" );
248
+ QgsDebugMsg ( " more Rule elements found: need a RuleRenderer" );
254
249
needRuleRenderer = true ;
255
- break ;
256
250
}
257
251
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
+ }
260
267
261
- if ( needRuleRenderer )
262
- {
263
- break ;
268
+ ruleElem = ruleElem.nextSiblingElement ( QStringLiteral ( " Rule" ) );
264
269
}
265
-
266
- ruleElem = ruleElem.nextSiblingElement ( QStringLiteral ( " Rule" ) );
270
+ featTypeStyleElem = featTypeStyleElem.nextSiblingElement ( QStringLiteral ( " FeatureTypeStyle" ) );
267
271
}
268
272
269
273
QString rendererType;
@@ -285,7 +289,7 @@ QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTyp
285
289
return nullptr ;
286
290
}
287
291
288
- QgsFeatureRenderer *r = m->createRendererFromSld ( featTypeStyleElem , geomType );
292
+ QgsFeatureRenderer *r = m->createRendererFromSld ( mergedFeatTypeStyle , geomType );
289
293
return r;
290
294
}
291
295
0 commit comments