Skip to content

Commit 3711fd5

Browse files
committed
WMS server: support multiple styles in GetStyles request
This code has been funded by Tuscany Region (Italy) - SITA (CIG: 6002233F59) and commissioned to Gis3W s.a.s.
1 parent f28a6d1 commit 3711fd5

File tree

5 files changed

+43
-13
lines changed

5 files changed

+43
-13
lines changed

python/core/symbology-ng/qgsrendererv2.sip

+5-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ class QgsFeatureRendererV2
111111
virtual QDomElement save( QDomDocument& doc );
112112

113113
//! create the SLD UserStyle element following the SLD v1.1 specs
114-
virtual QDomElement writeSld( QDomDocument& doc, const QgsVectorLayer &layer ) const;
114+
//! @deprecated since 2.8 - use the other override with styleName
115+
virtual QDomElement writeSld( QDomDocument& doc, const QgsVectorLayer &layer ) const /Deprecated/;
116+
//! create the SLD UserStyle element following the SLD v1.1 specs with the given name
117+
//! @note added in 2.8
118+
virtual QDomElement writeSld( QDomDocument& doc, const QString& styleName ) const;
115119

116120
/** create a new renderer according to the information contained in
117121
* the UserStyle element of a SLD style document

src/core/qgsvectorlayer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2007,7 +2007,7 @@ bool QgsVectorLayer::writeSld( QDomNode& node, QDomDocument& doc, QString& error
20072007

20082008
if ( hasGeometryType() )
20092009
{
2010-
node.appendChild( mRendererV2->writeSld( doc, *this ) );
2010+
node.appendChild( mRendererV2->writeSld( doc, name() ) );
20112011
}
20122012
return true;
20132013
}

src/core/symbology-ng/qgsrendererv2.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -488,11 +488,16 @@ QgsFeatureRendererV2* QgsFeatureRendererV2::loadSld( const QDomNode &node, QGis:
488488
}
489489

490490
QDomElement QgsFeatureRendererV2::writeSld( QDomDocument& doc, const QgsVectorLayer &layer ) const
491+
{
492+
return writeSld( doc, layer.name() );
493+
}
494+
495+
QDomElement QgsFeatureRendererV2::writeSld( QDomDocument& doc, const QString& styleName ) const
491496
{
492497
QDomElement userStyleElem = doc.createElement( "UserStyle" );
493498

494499
QDomElement nameElem = doc.createElement( "se:Name" );
495-
nameElem.appendChild( doc.createTextNode( layer.name() ) );
500+
nameElem.appendChild( doc.createTextNode( styleName ) );
496501
userStyleElem.appendChild( nameElem );
497502

498503
QDomElement featureTypeStyleElem = doc.createElement( "se:FeatureTypeStyle" );

src/core/symbology-ng/qgsrendererv2.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ class CORE_EXPORT QgsFeatureRendererV2
137137
virtual QDomElement save( QDomDocument& doc );
138138

139139
//! create the SLD UserStyle element following the SLD v1.1 specs
140-
virtual QDomElement writeSld( QDomDocument& doc, const QgsVectorLayer &layer ) const;
140+
//! @deprecated since 2.8 - use the other override with styleName
141+
Q_DECL_DEPRECATED virtual QDomElement writeSld( QDomDocument& doc, const QgsVectorLayer &layer ) const;
142+
//! create the SLD UserStyle element following the SLD v1.1 specs with the given name
143+
//! @note added in 2.8
144+
virtual QDomElement writeSld( QDomDocument& doc, const QString& styleName ) const;
141145

142146
/** create a new renderer according to the information contained in
143147
* the UserStyle element of a SLD style document

src/server/qgswmsprojectparser.cpp

+26-9
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgsmaplayerstylemanager.h"
2424
#include "qgsmapserviceexception.h"
2525
#include "qgspallabeling.h"
26+
#include "qgsrendererv2.h"
2627
#include "qgsvectorlayer.h"
2728

2829
#include "qgscomposition.h"
@@ -41,6 +42,10 @@
4142
#include <QFileInfo>
4243
#include <QTextDocument>
4344

45+
// style name to use for the unnamed style of layers (must not be empty name in WMS)
46+
// this implies that a layer style called "default" will not be usable in WMS server
47+
#define EMPTY_STYLE_NAME "default"
48+
4449
QgsWMSProjectParser::QgsWMSProjectParser( const QString& filePath )
4550
: QgsWMSConfigParser()
4651
{
@@ -119,7 +124,7 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
119124
if ( !styleName.isEmpty() )
120125
{
121126
// try to apply the specified style
122-
if ( !ml->styleManager()->setCurrentStyle( styleName ) )
127+
if ( !ml->styleManager()->setCurrentStyle( styleName != EMPTY_STYLE_NAME ? styleName : QString() ) )
123128
throw QgsMapServiceException( "StyleNotDefined", QString( "Style \"%1\" does not exist for layer \"%2\"" ).arg( styleName ).arg( lName ) );
124129
}
125130
return QList<QgsMapLayer*>() << ml;
@@ -901,10 +906,10 @@ void QgsWMSProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrde
901906

902907
void QgsWMSProjectParser::addLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem, const QString& version ) const
903908
{
904-
foreach ( const QString& styleName, currentLayer->styleManager()->styles() )
909+
foreach ( QString styleName, currentLayer->styleManager()->styles() )
905910
{
906911
if ( styleName.isEmpty() )
907-
continue; // do not explicitly list the default style with no name
912+
styleName = EMPTY_STYLE_NAME;
908913

909914
QDomElement styleElem = doc.createElement( "Style" );
910915
QDomElement styleNameElem = doc.createElement( "Name" );
@@ -1292,10 +1297,10 @@ void QgsWMSProjectParser::addLayers( QDomDocument &doc,
12921297

12931298
void QgsWMSProjectParser::addOWSLayerStyles( QgsMapLayer* currentLayer, QDomDocument& doc, QDomElement& layerElem ) const
12941299
{
1295-
foreach ( const QString& styleName, currentLayer->styleManager()->styles() )
1300+
foreach ( QString styleName, currentLayer->styleManager()->styles() )
12961301
{
12971302
if ( styleName.isEmpty() )
1298-
continue; // do not explicitly list the default style with no name
1303+
styleName = EMPTY_STYLE_NAME;
12991304

13001305
QDomElement styleListElem = doc.createElement( "StyleList" );
13011306
//only one default style in project file mode
@@ -1630,7 +1635,8 @@ QDomDocument QgsWMSProjectParser::getStyles( QStringList& layerList ) const
16301635
{
16311636
QString layerName;
16321637
layerName = layerList.at( i );
1633-
QList<QgsMapLayer*> currentLayerList = mapLayerFromStyle( layerName, "", true );
1638+
// don't use a cache - we may be changing styles
1639+
QList<QgsMapLayer*> currentLayerList = mapLayerFromStyle( layerName, "", false );
16341640
if ( currentLayerList.size() < 1 )
16351641
{
16361642
throw QgsMapServiceException( "Error", QString( "The layer for the TypeName '%1' is not found" ).arg( layerName ) );
@@ -1647,10 +1653,21 @@ QDomDocument QgsWMSProjectParser::getStyles( QStringList& layerList ) const
16471653
QDomElement namedLayerNode = myDocument.createElement( "NamedLayer" );
16481654
root.appendChild( namedLayerNode );
16491655

1650-
QString errorMsg;
1651-
if ( !layer->writeSld( namedLayerNode, myDocument, errorMsg ) )
1656+
// store the Name element
1657+
QDomElement nameNode = myDocument.createElement( "se:Name" );
1658+
nameNode.appendChild( myDocument.createTextNode( layerName ) );
1659+
namedLayerNode.appendChild( nameNode );
1660+
1661+
foreach ( QString styleName, layer->styleManager()->styles() )
16521662
{
1653-
throw QgsMapServiceException( "Error", QString( "Could not get style because:\n%1" ).arg( errorMsg ) );
1663+
if ( layer->hasGeometryType() )
1664+
{
1665+
layer->styleManager()->setCurrentStyle( styleName );
1666+
if ( styleName.isEmpty() )
1667+
styleName = EMPTY_STYLE_NAME;
1668+
QDomElement styleElem = layer->rendererV2()->writeSld( myDocument, styleName );
1669+
namedLayerNode.appendChild( styleElem );
1670+
}
16541671
}
16551672
}
16561673
}

0 commit comments

Comments
 (0)