QGIS API Documentation 3.43.0-Master (1af40ea95ba)
qgswmsgetstyles.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgswmsgetstyles.h
3 -------------------------
4 begin : December 20 , 2016
5 copyright : (C) 2007 by Marco Hugentobler (original code)
6 (C) 2014 by Alessandro Pasotti (original code)
7 (C) 2016 by David Marteau
8 email : marco dot hugentobler at karto dot baug dot ethz dot ch
9 a dot pasotti at itopen dot it
10 david dot marteau at 3liz dot com
11 ***************************************************************************/
12
13/***************************************************************************
14 * *
15 * This program is free software; you can redistribute it and/or modify *
16 * it under the terms of the GNU General Public License as published by *
17 * the Free Software Foundation; either version 2 of the License, or *
18 * (at your option) any later version. *
19 * *
20 ***************************************************************************/
21
22#include "qgswmsrequest.h"
23#include "qgswmsgetstyles.h"
24#include "qgswmsrendercontext.h"
25
26#include "qgsproject.h"
27#include "qgsrenderer.h"
28#include "qgsvectorlayer.h"
31#include "qgsserverresponse.h"
32#include "qgssldexportcontext.h"
33
34namespace QgsWms
35{
36
37 namespace
38 {
39 QDomDocument getStyledLayerDescriptorDocument( QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request );
40 }
41
42 void writeGetStyles( QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request, QgsServerResponse &response )
43 {
44 const QDomDocument doc = getStyles( serverIface, project, request );
45 response.setHeader( QStringLiteral( "Content-Type" ), QStringLiteral( "text/xml; charset=utf-8" ) );
46 response.write( doc.toByteArray() );
47 }
48
49 QDomDocument getStyles( QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request )
50 {
51 return getStyledLayerDescriptorDocument( serverIface, project, request );
52 }
53
54 namespace
55 {
56 QDomDocument getStyledLayerDescriptorDocument( QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request )
57 {
58 // init WMS parameters and context
59 const QgsWmsParameters parameters = request.wmsParameters();
60
61 QgsWmsRenderContext context( project, serverIface );
63 context.setParameters( parameters );
64
65 // init document
66 QDomDocument myDocument = QDomDocument();
67
68 const QDomNode header = myDocument.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"UTF-8\"" ) );
69 myDocument.appendChild( header );
70
71 // Create the root element
72 QDomElement root = myDocument.createElementNS( QStringLiteral( "http://www.opengis.net/sld" ), QStringLiteral( "StyledLayerDescriptor" ) );
73 root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.1.0" ) );
74 root.setAttribute( QStringLiteral( "xsi:schemaLocation" ), QStringLiteral( "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" ) );
75 root.setAttribute( QStringLiteral( "xmlns:ogc" ), QStringLiteral( "http://www.opengis.net/ogc" ) );
76 root.setAttribute( QStringLiteral( "xmlns:se" ), QStringLiteral( "http://www.opengis.net/se" ) );
77 root.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
78 root.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
79 myDocument.appendChild( root );
80
81 for ( auto layer : context.layersToRender() )
82 {
83 // Create the NamedLayer element
84 QDomElement namedLayerNode = myDocument.createElement( QStringLiteral( "NamedLayer" ) );
85 root.appendChild( namedLayerNode );
86
87 // store the Name element
88 QDomElement nameNode = myDocument.createElement( QStringLiteral( "se:Name" ) );
89 nameNode.appendChild( myDocument.createTextNode( context.layerNickname( *layer ) ) );
90 namedLayerNode.appendChild( nameNode );
91
92 if ( layer->type() != Qgis::LayerType::Vector )
93 continue;
94
95 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
96 if ( !vlayer->isSpatial() )
97 continue;
98
99 const QString currentStyle = vlayer->styleManager()->currentStyle();
100
101 QVariantMap props;
102 if ( vlayer->hasScaleBasedVisibility() )
103 {
104 props[QStringLiteral( "scaleMinDenom" )] = QString::number( vlayer->maximumScale() );
105 props[QStringLiteral( "scaleMaxDenom" )] = QString::number( vlayer->minimumScale() );
106 }
107
108 for ( const QString &styleName : vlayer->styleManager()->styles() )
109 {
110 vlayer->styleManager()->setCurrentStyle( styleName );
111
112 QDomElement userStyleElem = myDocument.createElement( QStringLiteral( "UserStyle" ) );
113
114 QDomElement styleNameElem = myDocument.createElement( QStringLiteral( "se:Name" ) );
115 styleNameElem.appendChild( myDocument.createTextNode( styleName ) );
116
117 userStyleElem.appendChild( styleNameElem );
118
119 QDomElement featureTypeStyleElem = myDocument.createElement( QStringLiteral( "se:FeatureTypeStyle" ) );
120 userStyleElem.appendChild( featureTypeStyleElem );
121
122 QgsSldExportContext exportContext;
123 exportContext.setExtraProperties( props );
124 vlayer->renderer()->toSld( myDocument, featureTypeStyleElem, exportContext );
125 if ( vlayer->labelsEnabled() )
126 {
127 vlayer->labeling()->toSld( featureTypeStyleElem, exportContext );
128 }
129
130 namedLayerNode.appendChild( userStyleElem );
131 }
132 vlayer->styleManager()->setCurrentStyle( currentStyle );
133 }
134
135 return myDocument;
136 }
137 } // namespace
138} // namespace QgsWms
@ Vector
Vector layer.
virtual Q_DECL_DEPRECATED void toSld(QDomNode &parent, const QVariantMap &props) const
Writes the SE 1.1 TextSymbolizer element based on the current layer labeling settings.
virtual Q_DECL_DEPRECATED void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
Used from subclasses to create SLD Rule elements following SLD v1.1 specs.
QString currentStyle() const
Returns name of the current style.
bool setCurrentStyle(const QString &name)
Set a different style as the current style - will apply it to the layer.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
double minimumScale() const
Returns the minimum map scale (i.e.
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
double maximumScale() const
Returns the maximum map scale (i.e.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:107
Defines interfaces exposed by QGIS Server and made available to plugins.
Defines the response interface passed to QgsService.
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device.
virtual void setHeader(const QString &key, const QString &value)=0
Set Header entry Add Header entry to the response Note that it is usually an error to set Header afte...
Holds SLD export options and other information related to SLD export of a QGIS layer style.
void setExtraProperties(const QVariantMap &properties)
Sets the open ended set of properties that can drive/inform the SLD encoding.
Represents a vector layer which manages a vector based dataset.
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
Defines request interfaces passed to WMS service.
Median cut implementation.
QDomDocument getStyles(QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request)
Returns an SLD file with the styles of the requested layers.
void writeGetStyles(QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request, QgsServerResponse &response)
Output GetStyles response.