QGIS API Documentation 3.41.0-Master (af5edcb665c)
Loading...
Searching...
No Matches
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, 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 vlayer->renderer()->toSld( myDocument, featureTypeStyleElem, props );
123 if ( vlayer->labelsEnabled() )
124 {
125 vlayer->labeling()->toSld( featureTypeStyleElem, props );
126 }
127
128 namedLayerNode.appendChild( userStyleElem );
129 }
130 vlayer->styleManager()->setCurrentStyle( currentStyle );
131 }
132
133 return myDocument;
134 }
135 } // namespace
136} // namespace QgsWms
@ Vector
Vector layer.
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
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
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.
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.