Skip to content

Commit

Permalink
SLD ElseFilter support
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso authored and nyalldawson committed Jan 9, 2023
1 parent a01a347 commit 913c365
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 9 deletions.
9 changes: 9 additions & 0 deletions python/core/auto_generated/qgsogcutils.sip.in
Expand Up @@ -184,6 +184,15 @@ with default values for the geometry name, srs name, honourAsisOrientation and i
otherwise null QDomElement
%End

static QDomElement elseFilterExpression( QDomDocument &doc );
%Docstring
Creates an ElseFilter from ``doc``

:return: valid OGC ElseFilter QDomElement

.. versionadded:: 3.28
%End

static QDomElement expressionToOgcExpression( const QgsExpression &exp,
QDomDocument &doc,
QgsOgcUtils::GMLVersion gmlVersion,
Expand Down
6 changes: 6 additions & 0 deletions src/core/qgsogcutils.cpp
Expand Up @@ -44,6 +44,7 @@
#define GML32_NAMESPACE QStringLiteral( "http://www.opengis.net/gml/3.2" )
#define OGC_NAMESPACE QStringLiteral( "http://www.opengis.net/ogc" )
#define FES_NAMESPACE QStringLiteral( "http://www.opengis.net/fes/2.0" )
#define SE_NAMESPACE QStringLiteral( "http://www.opengis.net/se" )

QgsOgcUtilsExprToFilter::QgsOgcUtilsExprToFilter( QDomDocument &doc,
QgsOgcUtils::GMLVersion gmlVersion,
Expand Down Expand Up @@ -1888,6 +1889,11 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp, QD
QStringLiteral( "geometry" ), QString(), false, false, errorMessage, requiresFilterElement );
}

QDomElement QgsOgcUtils::elseFilterExpression( QDomDocument &doc )
{
return doc.createElementNS( SE_NAMESPACE, QStringLiteral( "se:ElseFilter" ) );
}


QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &expression,
QDomDocument &doc,
Expand Down
7 changes: 7 additions & 0 deletions src/core/qgsogcutils.h
Expand Up @@ -220,6 +220,13 @@ class CORE_EXPORT QgsOgcUtils
static QDomElement expressionToOgcExpression( const QgsExpression &exp, QDomDocument &doc, QString *errorMessage = nullptr,
bool requiresFilterElement = false );

/**
* Creates an ElseFilter from \a doc
* \returns valid OGC ElseFilter QDomElement
* \since QGIS 3.28
*/
static QDomElement elseFilterExpression( QDomDocument &doc );

/**
* Creates an OGC expression XML element from the \a exp expression.
* \returns valid OGC expression QDomElement on success or a valid \verbatim <Filter> \endverbatim QDomElement when \a requiresFilterElement is set.
Expand Down
1 change: 1 addition & 0 deletions src/core/symbology/qgsrenderer.cpp
Expand Up @@ -265,6 +265,7 @@ QgsFeatureRenderer *QgsFeatureRenderer::loadSld( const QDomNode &node, QgsWkbTyp
{
// rule has filter or min/max scale denominator, use the RuleRenderer
if ( ruleChildElem.localName() == QLatin1String( "Filter" ) ||
ruleChildElem.localName() == QLatin1String( "ElseFilter" ) ||
ruleChildElem.localName() == QLatin1String( "MinScaleDenominator" ) ||
ruleChildElem.localName() == QLatin1String( "MaxScaleDenominator" ) )
{
Expand Down
5 changes: 5 additions & 0 deletions src/core/symbology/qgsrulebasedrenderer.cpp
Expand Up @@ -864,6 +864,11 @@ QgsRuleBasedRenderer::Rule *QgsRuleBasedRenderer::Rule::createFromSld( QDomEleme
delete filter;
}
}
else if ( childElem.localName() == QLatin1String( "ElseFilter" ) )
{
filterExp = QLatin1String( "ELSE" );

}
else if ( childElem.localName() == QLatin1String( "MinScaleDenominator" ) )
{
bool ok;
Expand Down
28 changes: 19 additions & 9 deletions src/core/symbology/qgssymbollayerutils.cpp
Expand Up @@ -2980,17 +2980,27 @@ bool QgsSymbolLayerUtils::createExpressionElement( QDomDocument &doc, QDomElemen

bool QgsSymbolLayerUtils::createFunctionElement( QDomDocument &doc, QDomElement &element, const QString &function )
{
// let's use QgsExpression to generate the SLD for the function
const QgsExpression expr( function );
if ( expr.hasParserError() )
// else rule is not a valid expression
if ( function == QLatin1String( "ELSE" ) )
{
element.appendChild( doc.createComment( "Parser Error: " + expr.parserErrorString() + " - Expression was: " + function ) );
return false;
}
const QDomElement filterElem = QgsOgcUtils::expressionToOgcFilter( expr, doc );
if ( !filterElem.isNull() )
const QDomElement filterElem = QgsOgcUtils::elseFilterExpression( doc );
element.appendChild( filterElem );
return true;
return true;
}
else
{
// let's use QgsExpression to generate the SLD for the function
const QgsExpression expr( function );
if ( expr.hasParserError() )
{
element.appendChild( doc.createComment( "Parser Error: " + expr.parserErrorString() + " - Expression was: " + function ) );
return false;
}
const QDomElement filterElem = QgsOgcUtils::expressionToOgcFilter( expr, doc );
if ( !filterElem.isNull() )
element.appendChild( filterElem );
return true;
}
}

bool QgsSymbolLayerUtils::functionFromSldElement( QDomElement &element, QString &function )
Expand Down

0 comments on commit 913c365

Please sign in to comment.