QGIS API Documentation 3.32.0-Lima (311a8cb8a6)
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
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,
43 const QgsWmsRequest &request, QgsServerResponse &response )
44 {
45 const QDomDocument doc = getStyles( serverIface, project, request );
46 response.setHeader( QStringLiteral( "Content-Type" ), QStringLiteral( "text/xml; charset=utf-8" ) );
47 response.write( doc.toByteArray() );
48 }
49
50 QDomDocument getStyles( QgsServerInterface *serverIface, const QgsProject *project,
51 const QgsWmsRequest &request )
52 {
53 return getStyledLayerDescriptorDocument( serverIface, project, request );
54 }
55
56 namespace
57 {
58 QDomDocument getStyledLayerDescriptorDocument( QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request )
59 {
60 // init WMS parameters and context
61 const QgsWmsParameters parameters = request.wmsParameters();
62
63 QgsWmsRenderContext context( project, serverIface );
65 context.setParameters( parameters );
66
67 // init document
68 QDomDocument myDocument = QDomDocument();
69
70 const QDomNode header = myDocument.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"UTF-8\"" ) );
71 myDocument.appendChild( header );
72
73 // Create the root element
74 QDomElement root = myDocument.createElementNS( QStringLiteral( "http://www.opengis.net/sld" ), QStringLiteral( "StyledLayerDescriptor" ) );
75 root.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.1.0" ) );
76 root.setAttribute( QStringLiteral( "xsi:schemaLocation" ), QStringLiteral( "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd" ) );
77 root.setAttribute( QStringLiteral( "xmlns:ogc" ), QStringLiteral( "http://www.opengis.net/ogc" ) );
78 root.setAttribute( QStringLiteral( "xmlns:se" ), QStringLiteral( "http://www.opengis.net/se" ) );
79 root.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
80 root.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
81 myDocument.appendChild( root );
82
83 for ( auto layer : context.layersToRender() )
84 {
85 // Create the NamedLayer element
86 QDomElement namedLayerNode = myDocument.createElement( QStringLiteral( "NamedLayer" ) );
87 root.appendChild( namedLayerNode );
88
89 // store the Name element
90 QDomElement nameNode = myDocument.createElement( QStringLiteral( "se:Name" ) );
91 nameNode.appendChild( myDocument.createTextNode( context.layerNickname( *layer ) ) );
92 namedLayerNode.appendChild( nameNode );
93
94 if ( layer->type() != Qgis::LayerType::Vector )
95 continue;
96
97 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
98 if ( ! vlayer->isSpatial() )
99 continue;
100
101 const QString currentStyle = vlayer->styleManager()->currentStyle();
102
103 QVariantMap props;
104 if ( vlayer->hasScaleBasedVisibility() )
105 {
106 props[ QStringLiteral( "scaleMinDenom" ) ] = QString::number( vlayer->maximumScale() );
107 props[ QStringLiteral( "scaleMaxDenom" ) ] = QString::number( vlayer->minimumScale() );
108 }
109
110 for ( const QString &styleName : vlayer->styleManager()->styles() )
111 {
112 vlayer->styleManager()->setCurrentStyle( styleName );
113
114 QDomElement userStyleElem = myDocument.createElement( QStringLiteral( "UserStyle" ) );
115
116 QDomElement styleNameElem = myDocument.createElement( QStringLiteral( "se:Name" ) );
117 styleNameElem.appendChild( myDocument.createTextNode( styleName ) );
118
119 userStyleElem.appendChild( styleNameElem );
120
121 QDomElement featureTypeStyleElem = myDocument.createElement( QStringLiteral( "se:FeatureTypeStyle" ) );
122 userStyleElem.appendChild( featureTypeStyleElem );
123
124 vlayer->renderer()->toSld( myDocument, featureTypeStyleElem, props );
125 if ( vlayer->labelsEnabled() )
126 {
127 vlayer->labeling()->toSld( featureTypeStyleElem, props );
128 }
129
130 namedLayerNode.appendChild( userStyleElem );
131 }
132 vlayer->styleManager()->setCurrentStyle( currentStyle );
133 }
134
135 return myDocument;
136 }
137 }
138} // namespace QgsWms
virtual void toSld(QDomNode &parent, const QVariantMap &props) const
Writes the SE 1.1 TextSymbolizer element based on the current layer labeling settings.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props=QVariantMap()) const
used from subclasses to create SLD Rule elements following SLD v1.1 specs
Definition: qgsrenderer.h:336
QString currentStyle() const
Returns name of the current style.
QStringList styles() const
Returns list of all defined style names.
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
QgsServerInterface Class defining interfaces exposed by QGIS Server and made available to plugins.
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
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...
Represents a vector layer which manages a vector based data sets.
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.
Class defining request interface passed to WMS service.
Definition: qgswmsrequest.h:35
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.