QGIS API Documentation 3.41.0-Master (45a0abf3bec)
Loading...
Searching...
No Matches
qgswmsgetcontext.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgswmsgetcontext.cpp
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#include "qgswmsutils.h"
22#include "qgswmsrequest.h"
23#include "qgswmsgetcontext.h"
25
26#include "qgslayertreenode.h"
27#include "qgslayertreegroup.h"
28#include "qgslayertreelayer.h"
29#include "qgslayertree.h"
32
33#include "qgsexception.h"
34
35#include <QRegularExpression>
36
37namespace QgsWms
38{
39 namespace
40 {
41 void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem, QgsMapLayer *currentLayer );
42
43 void appendOwsLayersFromTreeGroup( QDomDocument &doc,
44 QDomElement &parentLayer,
45 QgsServerInterface *serverIface,
46 const QgsProject *project,
47 const QgsWmsRequest &request,
48 const QgsLayerTreeGroup *layerTreeGroup,
49 QgsRectangle &combinedBBox,
50 const QString &strGroup );
51
52 void appendOwsGeneralAndResourceList( QDomDocument &doc, QDomElement &parentElement,
53 QgsServerInterface *serverIface, const QgsProject *project,
54 const QgsWmsRequest &request );
55 }
56
57 void writeGetContext( QgsServerInterface *serverIface, const QgsProject *project,
58 const QgsWmsRequest &request,
59 QgsServerResponse &response )
60 {
61#ifdef HAVE_SERVER_PYTHON_PLUGINS
62 QgsAccessControl *accessControl = serverIface->accessControls();
63#endif
64
65 QDomDocument doc;
66 const QDomDocument *contextDocument = nullptr;
67
68#ifdef HAVE_SERVER_PYTHON_PLUGINS
69 QgsServerCacheManager *cacheManager = serverIface->cacheManager();
70 if ( cacheManager && cacheManager->getCachedDocument( &doc, project, request, accessControl ) )
71 {
72 contextDocument = &doc;
73 }
74 else //context xml not in cache. Create a new one
75 {
76 doc = getContext( serverIface, project, request );
77
78 if ( cacheManager )
79 {
80 cacheManager->setCachedDocument( &doc, project, request, accessControl );
81 }
82 contextDocument = &doc;
83 }
84#else
85 doc = getContext( serverIface, project, request );
86 contextDocument = &doc;
87#endif
88 response.setHeader( QStringLiteral( "Content-Type" ), QStringLiteral( "text/xml; charset=utf-8" ) );
89 response.write( contextDocument->toByteArray() );
90 }
91
92
93 QDomDocument getContext( QgsServerInterface *serverIface,
94 const QgsProject *project,
95 const QgsWmsRequest &request )
96 {
97 QDomDocument doc;
98 const QDomProcessingInstruction xmlDeclaration = doc.createProcessingInstruction( QStringLiteral( "xml" ),
99 QStringLiteral( "version=\"1.0\" encoding=\"utf-8\"" ) );
100
101 doc.appendChild( xmlDeclaration );
102
103 QDomElement owsContextElem = doc.createElement( QStringLiteral( "OWSContext" ) );
104 owsContextElem.setAttribute( QStringLiteral( "xmlns" ), QStringLiteral( "http://www.opengis.net/ows-context" ) );
105 owsContextElem.setAttribute( QStringLiteral( "xmlns:ows-context" ), QStringLiteral( "http://www.opengis.net/ows-context" ) );
106 owsContextElem.setAttribute( QStringLiteral( "xmlns:context" ), QStringLiteral( "http://www.opengis.net/context" ) );
107 owsContextElem.setAttribute( QStringLiteral( "xmlns:ows" ), QStringLiteral( "http://www.opengis.net/ows" ) );
108 owsContextElem.setAttribute( QStringLiteral( "xmlns:sld" ), QStringLiteral( "http://www.opengis.net/sld" ) );
109 owsContextElem.setAttribute( QStringLiteral( "xmlns:ogc" ), QStringLiteral( "http://www.opengis.net/ogc" ) );
110 owsContextElem.setAttribute( QStringLiteral( "xmlns:gml" ), QStringLiteral( "http://www.opengis.net/gml" ) );
111 owsContextElem.setAttribute( QStringLiteral( "xmlns:kml" ), QStringLiteral( "http://www.opengis.net/kml/2.2" ) );
112 owsContextElem.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
113 owsContextElem.setAttribute( QStringLiteral( "xmlns:ns9" ), QStringLiteral( "http://www.w3.org/2005/Atom" ) );
114 owsContextElem.setAttribute( QStringLiteral( "xmlns:xal" ), QStringLiteral( "urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" ) );
115 owsContextElem.setAttribute( QStringLiteral( "xmlns:ins" ), QStringLiteral( "http://www.inspire.org" ) );
116 owsContextElem.setAttribute( QStringLiteral( "version" ), QStringLiteral( "0.3.1" ) );
117 doc.appendChild( owsContextElem );
118
119 appendOwsGeneralAndResourceList( doc, owsContextElem, serverIface, project, request );
120
121 return doc;
122 }
123 namespace
124 {
125 void appendOwsGeneralAndResourceList( QDomDocument &doc, QDomElement &parentElement,
126 QgsServerInterface *serverIface, const QgsProject *project,
127 const QgsWmsRequest &request )
128 {
129 parentElement.setAttribute( QStringLiteral( "id" ), "ows-context-" + project->baseName() );
130
131 // OWSContext General element
132 QDomElement generalElem = doc.createElement( QStringLiteral( "General" ) );
133
134 // OWSContext Window element
135 QDomElement windowElem = doc.createElement( QStringLiteral( "Window" ) );
136 windowElem.setAttribute( QStringLiteral( "height" ), QStringLiteral( "600" ) );
137 windowElem.setAttribute( QStringLiteral( "width" ), QStringLiteral( "800" ) );
138 generalElem.appendChild( windowElem );
139
140 //OWS title
141 const QString title = QgsServerProjectUtils::owsServiceTitle( *project );
142 QDomElement titleElem = doc.createElement( QStringLiteral( "ows:Title" ) );
143 const QDomText titleText = doc.createTextNode( title );
144 titleElem.appendChild( titleText );
145 generalElem.appendChild( titleElem );
146
147 //OWS abstract
148 const QString abstract = QgsServerProjectUtils::owsServiceAbstract( *project );
149 if ( !abstract.isEmpty() )
150 {
151 QDomElement abstractElem = doc.createElement( QStringLiteral( "ows:Abstract" ) );
152 const QDomText abstractText = doc.createCDATASection( abstract );
153 abstractElem.appendChild( abstractText );
154 generalElem.appendChild( abstractElem );
155 }
156
157 //OWS Keywords
158 const QStringList keywords = QgsServerProjectUtils::owsServiceKeywords( *project );
159 if ( !keywords.isEmpty() )
160 {
161 const bool sia2045 = QgsServerProjectUtils::wmsInfoFormatSia2045( *project );
162
163 QDomElement keywordsElem = doc.createElement( QStringLiteral( "ows:Keywords" ) );
164
165 for ( int i = 0; i < keywords.size(); ++i )
166 {
167 const QString keyword = keywords.at( i );
168 if ( !keyword.isEmpty() )
169 {
170 QDomElement keywordElem = doc.createElement( QStringLiteral( "ows:Keyword" ) );
171 const QDomText keywordText = doc.createTextNode( keyword );
172 keywordElem.appendChild( keywordText );
173 if ( sia2045 )
174 {
175 keywordElem.setAttribute( QStringLiteral( "vocabulary" ), QStringLiteral( "SIA_Geo405" ) );
176 }
177 keywordsElem.appendChild( keywordElem );
178 }
179 }
180 generalElem.appendChild( keywordsElem );
181 }
182
183 // OWSContext General element is complete
184 parentElement.appendChild( generalElem );
185
186 // OWSContext ResourceList element
187 QDomElement resourceListElem = doc.createElement( QStringLiteral( "ResourceList" ) );
188 const QgsLayerTree *projectLayerTreeRoot = project->layerTreeRoot();
189 QgsRectangle combinedBBox;
190 appendOwsLayersFromTreeGroup( doc, resourceListElem, serverIface, project, request, projectLayerTreeRoot, combinedBBox, QString() );
191 parentElement.appendChild( resourceListElem );
192
193 // OWSContext BoundingBox
194 const QgsCoordinateReferenceSystem projectCrs = project->crs();
196 if ( mapRect.isEmpty() )
197 {
198 mapRect = combinedBBox;
199 }
200 QDomElement bboxElem = doc.createElement( QStringLiteral( "ows:BoundingBox" ) );
201 bboxElem.setAttribute( QStringLiteral( "crs" ), projectCrs.authid() );
202 if ( projectCrs.hasAxisInverted() )
203 {
204 mapRect.invert();
205 }
206 QDomElement lowerCornerElem = doc.createElement( QStringLiteral( "ows:LowerCorner" ) );
207 const QDomText lowerCornerText = doc.createTextNode( QString::number( mapRect.xMinimum() ) + " " + QString::number( mapRect.yMinimum() ) );
208 lowerCornerElem.appendChild( lowerCornerText );
209 bboxElem.appendChild( lowerCornerElem );
210 QDomElement upperCornerElem = doc.createElement( QStringLiteral( "ows:UpperCorner" ) );
211 const QDomText upperCornerText = doc.createTextNode( QString::number( mapRect.xMaximum() ) + " " + QString::number( mapRect.yMaximum() ) );
212 upperCornerElem.appendChild( upperCornerText );
213 bboxElem.appendChild( upperCornerElem );
214 generalElem.appendChild( bboxElem );
215 }
216
217 void appendOwsLayersFromTreeGroup( QDomDocument &doc,
218 QDomElement &parentLayer,
219 QgsServerInterface *serverIface,
220 const QgsProject *project,
221 const QgsWmsRequest &request,
222 const QgsLayerTreeGroup *layerTreeGroup,
223 QgsRectangle &combinedBBox,
224 const QString &strGroup )
225 {
226 const QStringList restrictedLayers = QgsServerProjectUtils::wmsRestrictedLayers( *project );
227
228 const QList< QgsLayerTreeNode * > layerTreeGroupChildren = layerTreeGroup->children();
229 for ( int i = 0; i < layerTreeGroupChildren.size(); ++i )
230 {
231 QgsLayerTreeNode *treeNode = layerTreeGroupChildren.at( i );
232
233 if ( treeNode->nodeType() == QgsLayerTreeNode::NodeGroup )
234 {
235 QgsLayerTreeGroup *treeGroupChild = static_cast<QgsLayerTreeGroup *>( treeNode );
236
237 const QString name = treeGroupChild->name();
238 if ( restrictedLayers.contains( name ) ) //unpublished group
239 {
240 continue;
241 }
242
243 QString group;
244 if ( strGroup.isEmpty() )
245 {
246 group = name;
247 }
248 else
249 {
250 group = strGroup + "/" + name;
251 }
252
253 appendOwsLayersFromTreeGroup( doc, parentLayer, serverIface, project, request, treeGroupChild, combinedBBox, group );
254 }
255 else
256 {
257 QgsLayerTreeLayer *treeLayer = static_cast<QgsLayerTreeLayer *>( treeNode );
258 QgsMapLayer *l = treeLayer->layer();
259 if ( restrictedLayers.contains( l->name() ) ) //unpublished layer
260 {
261 continue;
262 }
263#ifdef HAVE_SERVER_PYTHON_PLUGINS
264 QgsAccessControl *accessControl = serverIface->accessControls();
265 if ( accessControl && !accessControl->layerReadPermission( l ) )
266 {
267 continue;
268 }
269#endif
270 QDomElement layerElem = doc.createElement( QStringLiteral( "Layer" ) );
271
272 // queryable layer
273 if ( !l->flags().testFlag( QgsMapLayer::Identifiable ) )
274 {
275 layerElem.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "false" ) );
276 }
277 else
278 {
279 layerElem.setAttribute( QStringLiteral( "queryable" ), QStringLiteral( "true" ) );
280 }
281
282 // visibility
283 if ( treeLayer->itemVisibilityChecked() )
284 {
285 layerElem.setAttribute( QStringLiteral( "hidden" ), QStringLiteral( "false" ) );
286 }
287 else
288 {
289 layerElem.setAttribute( QStringLiteral( "hidden" ), QStringLiteral( "true" ) );
290 }
291
292 // layer group
293 if ( !strGroup.isEmpty() )
294 {
295 layerElem.setAttribute( QStringLiteral( "group" ), strGroup );
296 }
297
298 // Because Layer transparency is used for the rendering
299 // OWSContext Layer opacity is set to 1
300 layerElem.setAttribute( QStringLiteral( "opacity" ), 1 );
301
302 QString wmsName = l->name();
304 {
305 wmsName = l->id();
306 }
307 else if ( !l->serverProperties()->shortName().isEmpty() )
308 {
309 wmsName = l->serverProperties()->shortName();
310 }
311 // layer wms name
312 layerElem.setAttribute( QStringLiteral( "name" ), wmsName );
313 // define an id based on layer wms name
314 const thread_local QRegularExpression sRegEx( QStringLiteral( "[\\W]" ), QRegularExpression::UseUnicodePropertiesOption );
315 layerElem.setAttribute( QStringLiteral( "id" ), wmsName.replace( sRegEx, QStringLiteral( "_" ) ) );
316
317 // layer title
318 QDomElement titleElem = doc.createElement( QStringLiteral( "ows:Title" ) );
319 QString title = l->serverProperties()->title();
320 if ( title.isEmpty() )
321 {
322 title = l->name();
323 }
324 const QDomText titleText = doc.createTextNode( title );
325 titleElem.appendChild( titleText );
326 layerElem.appendChild( titleElem );
327
328 // WMS GetMap output format
329 QDomElement formatElem = doc.createElement( QStringLiteral( "ows:OutputFormat" ) );
330 const QDomText formatText = doc.createTextNode( QStringLiteral( "image/png" ) );
331 formatElem.appendChild( formatText );
332 layerElem.appendChild( formatElem );
333
334 // Get WMS service URL for Server Element
335 const QUrl href = serviceUrl( request, project, *serverIface->serverSettings() );
336
337 //href needs to be a prefix
338 QString hrefString = href.toString();
339 hrefString.append( href.hasQuery() ? "&" : "?" );
340
341 // COntext Server Element with WMS service URL
342 QDomElement serverElem = doc.createElement( QStringLiteral( "Server" ) );
343 serverElem.setAttribute( QStringLiteral( "service" ), QStringLiteral( "urn:ogc:serviceType:WMS" ) );
344 serverElem.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.3.0" ) );
345 serverElem.setAttribute( QStringLiteral( "default" ), QStringLiteral( "true" ) );
346 QDomElement orServerElem = doc.createElement( QStringLiteral( "OnlineResource" ) );
347 orServerElem.setAttribute( QStringLiteral( "xlink:href" ), hrefString );
348 serverElem.appendChild( orServerElem );
349 layerElem.appendChild( serverElem );
350
351 const QString abstract = l->serverProperties()->abstract();
352 if ( !abstract.isEmpty() )
353 {
354 QDomElement abstractElem = doc.createElement( QStringLiteral( "ows:Abstract" ) );
355 const QDomText abstractText = doc.createTextNode( abstract );
356 abstractElem.appendChild( abstractText );
357 layerElem.appendChild( abstractElem );
358 }
359
360 //min/max scale denominatorScaleBasedVisibility
361 if ( l->hasScaleBasedVisibility() )
362 {
363 const QString minScaleString = QString::number( l->maximumScale() );
364 const QString maxScaleString = QString::number( l->minimumScale() );
365 QDomElement minScaleElem = doc.createElement( QStringLiteral( "sld:MinScaleDenominator" ) );
366 const QDomText minScaleText = doc.createTextNode( minScaleString );
367 minScaleElem.appendChild( minScaleText );
368 layerElem.appendChild( minScaleElem );
369 QDomElement maxScaleElem = doc.createElement( QStringLiteral( "sld:MaxScaleDenominator" ) );
370 const QDomText maxScaleText = doc.createTextNode( maxScaleString );
371 maxScaleElem.appendChild( maxScaleText );
372 layerElem.appendChild( maxScaleElem );
373 }
374
375 // Style list
376 appendOwsLayerStyles( doc, layerElem, l );
377
378 //keyword list
379 if ( !l->serverProperties()->keywordList().isEmpty() )
380 {
381 const QStringList keywordStringList = l->serverProperties()->keywordList().split( ',' );
382 const bool sia2045 = QgsServerProjectUtils::wmsInfoFormatSia2045( *project );
383
384 QDomElement keywordsElem = doc.createElement( QStringLiteral( "ows:Keywords" ) );
385 for ( int i = 0; i < keywordStringList.size(); ++i )
386 {
387 QDomElement keywordElem = doc.createElement( QStringLiteral( "ows:Keyword" ) );
388 const QDomText keywordText = doc.createTextNode( keywordStringList.at( i ).trimmed() );
389 keywordElem.appendChild( keywordText );
390 if ( sia2045 )
391 {
392 keywordElem.setAttribute( QStringLiteral( "vocabulary" ), QStringLiteral( "SIA_Geo405" ) );
393 }
394 keywordsElem.appendChild( keywordElem );
395 }
396 layerElem.appendChild( keywordsElem );
397 }
398
399 // layer data URL
400 const QString dataUrl = l->serverProperties()->dataUrl();
401 if ( !dataUrl.isEmpty() )
402 {
403 QDomElement dataUrlElem = doc.createElement( QStringLiteral( "DataURL" ) );
404 const QString dataUrlFormat = l->serverProperties()->dataUrlFormat();
405 dataUrlElem.setAttribute( QStringLiteral( "format" ), dataUrlFormat );
406 QDomElement dataORElem = doc.createElement( QStringLiteral( "OnlineResource" ) );
407 dataORElem.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
408 dataORElem.setAttribute( QStringLiteral( "xlink:type" ), QStringLiteral( "simple" ) );
409 dataORElem.setAttribute( QStringLiteral( "xlink:href" ), dataUrl );
410 dataUrlElem.appendChild( dataORElem );
411 layerElem.appendChild( dataUrlElem );
412 }
413
414 // layer metadata URL
415 const QList<QgsMapLayerServerProperties::MetadataUrl> urls = l->serverProperties()->metadataUrls();
416 for ( const QgsMapLayerServerProperties::MetadataUrl &url : urls )
417 {
418 QDomElement metaUrlElem = doc.createElement( QStringLiteral( "MetadataURL" ) );
419 metaUrlElem.setAttribute( QStringLiteral( "format" ), url.format );
420 QDomElement metaUrlORElem = doc.createElement( QStringLiteral( "OnlineResource" ) );
421 metaUrlORElem.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
422 metaUrlORElem.setAttribute( QStringLiteral( "xlink:type" ), QStringLiteral( "simple" ) );
423 metaUrlORElem.setAttribute( QStringLiteral( "xlink:href" ), url.url );
424 metaUrlElem.appendChild( metaUrlORElem );
425 layerElem.appendChild( metaUrlElem );
426 }
427
428 // update combineBBox
429 try
430 {
431 const QgsCoordinateTransform t( l->crs(), project->crs(), project );
432 const QgsRectangle BBox = t.transformBoundingBox( l->extent() );
433 if ( combinedBBox.isEmpty() )
434 {
435 combinedBBox = BBox;
436 }
437 else
438 {
439 combinedBBox.combineExtentWith( BBox );
440 }
441 }
442 catch ( const QgsCsException &cse )
443 {
444 Q_UNUSED( cse )
445 }
446
447 if ( parentLayer.hasChildNodes() )
448 {
449 parentLayer.insertBefore( layerElem, parentLayer.firstChild() );
450 }
451 else
452 {
453 parentLayer.appendChild( layerElem );
454 }
455 }// end of treeNode type
456 }// end of for
457 }
458
459 void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem, QgsMapLayer *currentLayer )
460 {
461 for ( const QString &styleName : currentLayer->styleManager()->styles() )
462 {
463 QDomElement styleListElem = doc.createElement( QStringLiteral( "StyleList" ) );
464 //only one default style in project file mode
465 QDomElement styleElem = doc.createElement( QStringLiteral( "Style" ) );
466 styleElem.setAttribute( QStringLiteral( "current" ), QStringLiteral( "true" ) );
467 QDomElement styleNameElem = doc.createElement( QStringLiteral( "Name" ) );
468 const QDomText styleNameText = doc.createTextNode( styleName );
469 styleNameElem.appendChild( styleNameText );
470 QDomElement styleTitleElem = doc.createElement( QStringLiteral( "Title" ) );
471 const QDomText styleTitleText = doc.createTextNode( styleName );
472 styleTitleElem.appendChild( styleTitleText );
473 styleElem.appendChild( styleNameElem );
474 styleElem.appendChild( styleTitleElem );
475 styleListElem.appendChild( styleElem );
476 layerElem.appendChild( styleListElem );
477 }
478 }
479 }
480
481} // namespace QgsWms
A helper class that centralizes restrictions given by all the access control filter plugins.
bool layerReadPermission(const QgsMapLayer *layer) const
Returns the layer read right.
This class represents a coordinate reference system (CRS).
bool hasAxisInverted() const
Returns whether the axis order is inverted for the CRS compared to the order east/north (longitude/la...
Class for doing transforms between two map coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
Layer tree group node serves as a container for layers and further groups.
QString name() const override
Returns the group's name.
Layer tree node points to a map layer.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
This class is a base class for nodes in a layer tree.
@ NodeGroup
Container of other groups and layers.
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children)
Namespace with helper functions for layer tree operations.
QString dataUrlFormat() const
Returns the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request.
QString keywordList() const
Returns the keyword list of the layerused by QGIS Server in GetCapabilities request.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QString abstract() const
Returns the abstract of the layerused by QGIS Server in GetCapabilities request.
Base class for all map layer types.
Definition qgsmaplayer.h:76
QString name
Definition qgsmaplayer.h:80
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
QgsCoordinateReferenceSystem crs
Definition qgsmaplayer.h:83
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
QString id
Definition qgsmaplayer.h:79
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
double minimumScale() const
Returns the minimum map scale (i.e.
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
QString baseName() const
Returns the base name of the project file without the path and without extension - derived from fileN...
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.
QgsCoordinateReferenceSystem crs
Definition qgsproject.h:112
A rectangle specified with double values.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
double xMaximum() const
Returns the x maximum value (right side of rectangle).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
bool isEmpty() const
Returns true if the rectangle has no area.
void invert()
Swap x/y coordinates in the rectangle.
A helper class that centralizes caches accesses given by all the server cache filter plugins.
bool setCachedDocument(const QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Updates or inserts the document in cache like capabilities.
bool getCachedDocument(QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Returns cached document (or 0 if document not in cache) like capabilities.
QgsServerInterface Class defining interfaces exposed by QGIS Server and made available to plugins.
virtual QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache filters.
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
virtual QgsServerSettings * serverSettings()=0
Returns the server settings.
QList< QgsServerMetadataUrlProperties::MetadataUrl > metadataUrls() const
Returns a list of metadataUrl resources associated for the layer.
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...
Class defining request interface passed to WMS service.
SERVER_EXPORT bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145.
SERVER_EXPORT QgsRectangle wmsExtent(const QgsProject &project)
Returns the WMS Extent restriction.
SERVER_EXPORT bool wmsUseLayerIds(const QgsProject &project)
Returns if layer ids are used as name in WMS.
SERVER_EXPORT QStringList owsServiceKeywords(const QgsProject &project)
Returns the owsService keywords defined in project.
SERVER_EXPORT QStringList wmsRestrictedLayers(const QgsProject &project)
Returns the restricted layer name list.
SERVER_EXPORT QString owsServiceTitle(const QgsProject &project)
Returns the owsService title defined in project.
SERVER_EXPORT QString owsServiceAbstract(const QgsProject &project)
Returns the owsService abstract defined in project.
Median cut implementation.
void writeGetContext(QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request, QgsServerResponse &response)
Output GetContext response.
QDomDocument getContext(QgsServerInterface *serverIface, const QgsProject *project, const QgsWmsRequest &request)
Returns XML document for the 'GetContext' request.
QUrl serviceUrl(const QgsServerRequest &request, const QgsProject *project, const QgsServerSettings &settings)
Returns WMS service URL.