Skip to content

Commit 6e855d8

Browse files
committed
fix export from Graduated renderingV2 to SLD, generate valid SLD docs (fix #5795):
Description tag must have a child tag, OnlineResource tag and its child Format tag must have SE namespace, Filter tag created and never appended to the Rule element exporting from a Graduated rendering, fix convertion between PropertyIsBetween tag and QgsExpression
1 parent 1d6943d commit 6e855d8

File tree

4 files changed

+33
-21
lines changed

4 files changed

+33
-21
lines changed

src/core/qgsexpression.cpp

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -689,31 +689,38 @@ QgsExpression::Node* QgsExpression::Node::createFromOgcFilter( QDomElement &elem
689689
else if ( element.localName() == "PropertyIsBetween" )
690690
{
691691
// <ogc:PropertyIsBetween> encode a Range check
692-
QgsExpression::Node *operand = 0, *lowerBound = 0, *upperBound = 0;
692+
QgsExpression::Node *operand = 0, *lowerBound = 0;
693+
QgsExpression::Node *operand2 = 0, *upperBound = 0;
693694

694-
QDomElement operandElem = element.firstChildElement( "LowerBoundary" );
695-
if ( !operandElem.isNull() )
696-
lowerBound = createFromOgcFilter( operandElem, errorMessage );
697-
698-
operandElem = element.firstChildElement( "UpperBoundary" );
699-
if ( !operandElem.isNull() )
700-
upperBound = createFromOgcFilter( operandElem, errorMessage );
701-
702-
// <ogc:expression>
703-
operandElem = element.firstChildElement();
704-
while ( !operandElem.isNull() )
695+
QDomElement operandElem = element.firstChildElement();
696+
while( !operandElem.isNull() )
705697
{
706-
if ( operandElem.localName() != "LowerBoundary" &&
707-
operandElem.localName() != "UpperBoundary" )
698+
if ( operandElem.localName() == "LowerBoundary" )
699+
{
700+
QDomElement lowerBoundElem = operandElem.firstChildElement();
701+
lowerBound = createFromOgcFilter( lowerBoundElem, errorMessage );
702+
}
703+
else if ( operandElem.localName() == "UpperBoundary" )
708704
{
705+
QDomElement upperBoundElem = operandElem.firstChildElement();
706+
upperBound = createFromOgcFilter( upperBoundElem, errorMessage );
707+
}
708+
else
709+
{
710+
// <ogc:expression>
711+
// both operand and operand2 contain the same expression,
712+
// they are respectively compared to lower bound and upper bound
709713
operand = createFromOgcFilter( operandElem, errorMessage );
710-
break;
714+
operand2 = createFromOgcFilter( operandElem, errorMessage );
711715
}
712716

717+
if ( operand && lowerBound && operand2 && upperBound )
718+
break;
719+
713720
operandElem = operandElem.nextSiblingElement();
714721
}
715722

716-
if ( !operand || !lowerBound || !upperBound )
723+
if ( !operand || !lowerBound || !operand2 || !upperBound )
717724
{
718725
if ( operand )
719726
delete operand;
@@ -729,7 +736,7 @@ QgsExpression::Node* QgsExpression::Node::createFromOgcFilter( QDomElement &elem
729736
}
730737

731738
QgsExpression::Node *geOperator = new QgsExpression::NodeBinaryOperator( boGE, operand, lowerBound );
732-
QgsExpression::Node *leOperator = new QgsExpression::NodeBinaryOperator( boLE, operand, upperBound );
739+
QgsExpression::Node *leOperator = new QgsExpression::NodeBinaryOperator( boLE, operand2, upperBound );
733740
return new QgsExpression::NodeBinaryOperator( boAnd, geOperator, leOperator );
734741
}
735742

src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ void QgsRendererCategoryV2::toSld( QDomDocument &doc, QDomElement &element, QgsS
9797
ruleElem.appendChild( nameElem );
9898

9999
QDomElement descrElem = doc.createElement( "se:Description" );
100+
QDomElement abstractElem = doc.createElement( "se:Abstract" );
100101
QString descrStr = QString( "%1 is '%2'" ).arg( attrName ).arg( mValue.toString() );
101-
descrElem.appendChild( doc.createTextNode( !mLabel.isEmpty() ? mLabel : descrStr ) );
102+
abstractElem.appendChild( doc.createTextNode( !mLabel.isEmpty() ? mLabel : descrStr ) );
103+
descrElem.appendChild( abstractElem );
102104
ruleElem.appendChild( descrElem );
103105

104106
// create the ogc:Filter for the range

src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,10 @@ void QgsRendererRangeV2::toSld( QDomDocument &doc, QDomElement &element, QgsStri
114114
ruleElem.appendChild( nameElem );
115115

116116
QDomElement descrElem = doc.createElement( "se:Description" );
117+
QDomElement abstractElem = doc.createElement( "se:Abstract" );
117118
QString descrStr = QString( "range: %1 - %2" ).arg( mLowerValue ).arg( mUpperValue );
118-
descrElem.appendChild( doc.createTextNode( !mLabel.isEmpty() ? mLabel : descrStr ) );
119+
abstractElem.appendChild( doc.createTextNode( !mLabel.isEmpty() ? mLabel : descrStr ) );
120+
descrElem.appendChild( abstractElem );
119121
ruleElem.appendChild( descrElem );
120122

121123
// create the ogc:Filter for the range
@@ -124,6 +126,7 @@ void QgsRendererRangeV2::toSld( QDomDocument &doc, QDomElement &element, QgsStri
124126
.arg( attrName.replace( "\"", "\"\"" ) )
125127
.arg( mLowerValue ).arg( mUpperValue );
126128
QgsSymbolLayerV2Utils::createFunctionElement( doc, filterElem, filterFunc );
129+
ruleElem.appendChild( filterElem );
127130

128131
mSymbol->toSld( doc, ruleElem, props );
129132
}

src/core/symbology-ng/qgssymbollayerv2utils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,12 +2057,12 @@ bool QgsSymbolLayerV2Utils::functionFromSldElement( QDomElement &element, QStrin
20572057
void QgsSymbolLayerV2Utils::createOnlineResourceElement( QDomDocument &doc, QDomElement &element,
20582058
QString path, QString format )
20592059
{
2060-
QDomElement onlineResourceElem = doc.createElement( "OnlineResource" );
2060+
QDomElement onlineResourceElem = doc.createElement( "se:OnlineResource" );
20612061
onlineResourceElem.setAttribute( "xlink:type", "simple" );
20622062
onlineResourceElem.setAttribute( "xlink:href", path );
20632063
element.appendChild( onlineResourceElem );
20642064

2065-
QDomElement formatElem = doc.createElement( "Format" );
2065+
QDomElement formatElem = doc.createElement( "se:Format" );
20662066
formatElem.appendChild( doc.createTextNode( format ) );
20672067
element.appendChild( formatElem );
20682068
}

0 commit comments

Comments
 (0)