Skip to content

Commit 8ab4472

Browse files
committed
WMS server: Support <NamedStyle> in SLD
When using <NamedStyle> make sure the passed SLD XML has attribute units="mm" in the root <StyledLayerDescriptor> tag. Otherwise the WMS server applies scaling as if all sizes were in pixels. The correct approach would be to just scale sizes when loading symbols from SLD - not to apply such scaling globally This code has been funded by Tuscany Region (Italy) - SITA (CIG: 6002233F59) and commissioned to Gis3W s.a.s.
1 parent 2e4c7c9 commit 8ab4472

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/server/qgssldconfigparser.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,18 @@ QList<QgsMapLayer*> QgsSLDConfigParser::mapLayerFromStyle( const QString& lName,
256256
}
257257
}
258258
}
259+
260+
// try with a predefined named style
261+
QDomElement namedStyleElement = findNamedStyleElement( namedLayerElemList[i], styleName );
262+
if ( !namedStyleElement.isNull() )
263+
{
264+
fallbackLayerList = mFallbackParser->mapLayerFromStyle( lName, styleName, false );
265+
if ( fallbackLayerList.size() > 0 )
266+
{
267+
resultList << fallbackLayerList;
268+
return resultList;
269+
}
270+
}
259271
}
260272

261273
QDomElement userLayerElement = findUserLayerElement( lName );
@@ -799,6 +811,27 @@ QDomElement QgsSLDConfigParser::findUserStyleElement( const QDomElement& userLay
799811
return defaultResult;
800812
}
801813

814+
QDomElement QgsSLDConfigParser::findNamedStyleElement( const QDomElement& layerElement, const QString& styleName ) const
815+
{
816+
QDomElement defaultResult;
817+
if ( !layerElement.isNull() )
818+
{
819+
QDomNodeList styleList = layerElement.elementsByTagName( "NamedStyle" );
820+
for ( int i = 0; i < styleList.size(); ++i )
821+
{
822+
QDomNodeList nameList = styleList.item( i ).toElement().elementsByTagName( "Name" );
823+
if ( nameList.size() > 0 )
824+
{
825+
if ( nameList.item( 0 ).toElement().text() == styleName )
826+
{
827+
return styleList.item( i ).toElement();
828+
}
829+
}
830+
}
831+
}
832+
return defaultResult;
833+
}
834+
802835
QgsFeatureRendererV2* QgsSLDConfigParser::rendererFromUserStyle( const QDomElement& userStyleElement, QgsVectorLayer* vec ) const
803836
{
804837
if ( !vec || userStyleElement.isNull() )

src/server/qgssldconfigparser.h

+3
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ class QgsSLDConfigParser : public QgsWMSConfigParser
159159
/**Returns the <UserStyle> node of a given <UserLayer> or a null node in case of failure*/
160160
QDomElement findUserStyleElement( const QDomElement& userLayerElement, const QString& styleName ) const;
161161

162+
/**Returns the <NamedStyle> node of a given <NamedLayer> or a null node in case of failure*/
163+
QDomElement findNamedStyleElement( const QDomElement& layerElement, const QString& styleName ) const;
164+
162165
/**Creates a Renderer from a UserStyle SLD node. Returns 0 in case of error*/
163166
QgsFeatureRendererV2* rendererFromUserStyle( const QDomElement& userStyleElement, QgsVectorLayer* vec ) const;
164167

0 commit comments

Comments
 (0)