Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
wonder-sk committed Jan 13, 2015
1 parent f28a6d1 commit 3711fd5
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 13 deletions.
6 changes: 5 additions & 1 deletion python/core/symbology-ng/qgsrendererv2.sip
Expand Up @@ -111,7 +111,11 @@ class QgsFeatureRendererV2
virtual QDomElement save( QDomDocument& doc );

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

/** create a new renderer according to the information contained in
* the UserStyle element of a SLD style document
Expand Down
2 changes: 1 addition & 1 deletion src/core/qgsvectorlayer.cpp
Expand Up @@ -2007,7 +2007,7 @@ bool QgsVectorLayer::writeSld( QDomNode& node, QDomDocument& doc, QString& error

if ( hasGeometryType() )
{
node.appendChild( mRendererV2->writeSld( doc, *this ) );
node.appendChild( mRendererV2->writeSld( doc, name() ) );
}
return true;
}
Expand Down
7 changes: 6 additions & 1 deletion src/core/symbology-ng/qgsrendererv2.cpp
Expand Up @@ -488,11 +488,16 @@ QgsFeatureRendererV2* QgsFeatureRendererV2::loadSld( const QDomNode &node, QGis:
}

QDomElement QgsFeatureRendererV2::writeSld( QDomDocument& doc, const QgsVectorLayer &layer ) const
{
return writeSld( doc, layer.name() );
}

QDomElement QgsFeatureRendererV2::writeSld( QDomDocument& doc, const QString& styleName ) const
{
QDomElement userStyleElem = doc.createElement( "UserStyle" );

QDomElement nameElem = doc.createElement( "se:Name" );
nameElem.appendChild( doc.createTextNode( layer.name() ) );
nameElem.appendChild( doc.createTextNode( styleName ) );
userStyleElem.appendChild( nameElem );

QDomElement featureTypeStyleElem = doc.createElement( "se:FeatureTypeStyle" );
Expand Down
6 changes: 5 additions & 1 deletion src/core/symbology-ng/qgsrendererv2.h
Expand Up @@ -137,7 +137,11 @@ class CORE_EXPORT QgsFeatureRendererV2
virtual QDomElement save( QDomDocument& doc );

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

/** create a new renderer according to the information contained in
* the UserStyle element of a SLD style document
Expand Down
35 changes: 26 additions & 9 deletions src/server/qgswmsprojectparser.cpp
Expand Up @@ -23,6 +23,7 @@
#include "qgsmaplayerstylemanager.h"
#include "qgsmapserviceexception.h"
#include "qgspallabeling.h"
#include "qgsrendererv2.h"
#include "qgsvectorlayer.h"

#include "qgscomposition.h"
Expand All @@ -41,6 +42,10 @@
#include <QFileInfo>
#include <QTextDocument>

// style name to use for the unnamed style of layers (must not be empty name in WMS)
// this implies that a layer style called "default" will not be usable in WMS server
#define EMPTY_STYLE_NAME "default"

QgsWMSProjectParser::QgsWMSProjectParser( const QString& filePath )
: QgsWMSConfigParser()
{
Expand Down Expand Up @@ -119,7 +124,7 @@ QList<QgsMapLayer*> QgsWMSProjectParser::mapLayerFromStyle( const QString& lName
if ( !styleName.isEmpty() )
{
// try to apply the specified style
if ( !ml->styleManager()->setCurrentStyle( styleName ) )
if ( !ml->styleManager()->setCurrentStyle( styleName != EMPTY_STYLE_NAME ? styleName : QString() ) )
throw QgsMapServiceException( "StyleNotDefined", QString( "Style \"%1\" does not exist for layer \"%2\"" ).arg( styleName ).arg( lName ) );
}
return QList<QgsMapLayer*>() << ml;
Expand Down Expand Up @@ -901,10 +906,10 @@ void QgsWMSProjectParser::addDrawingOrder( QDomElement elem, bool useDrawingOrde

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

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

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

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

QString errorMsg;
if ( !layer->writeSld( namedLayerNode, myDocument, errorMsg ) )
// store the Name element
QDomElement nameNode = myDocument.createElement( "se:Name" );
nameNode.appendChild( myDocument.createTextNode( layerName ) );
namedLayerNode.appendChild( nameNode );

foreach ( QString styleName, layer->styleManager()->styles() )
{
throw QgsMapServiceException( "Error", QString( "Could not get style because:\n%1" ).arg( errorMsg ) );
if ( layer->hasGeometryType() )
{
layer->styleManager()->setCurrentStyle( styleName );
if ( styleName.isEmpty() )
styleName = EMPTY_STYLE_NAME;
QDomElement styleElem = layer->rendererV2()->writeSld( myDocument, styleName );
namedLayerNode.appendChild( styleElem );
}
}
}
}
Expand Down

0 comments on commit 3711fd5

Please sign in to comment.