QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
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"
24 #include "qgsserverprojectutils.h"
25 
26 #include "qgslayertreenode.h"
27 #include "qgslayertreegroup.h"
28 #include "qgslayertreelayer.h"
29 #include "qgslayertree.h"
31 #include "qgscoordinatetransform.h"
32 
33 #include "qgsexception.h"
34 
35 #include <QRegularExpression>
36 
37 namespace 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();
195  QgsRectangle mapRect = QgsServerProjectUtils::wmsExtent( *project );
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();
303  if ( QgsServerProjectUtils::wmsUseLayerIds( *project ) )
304  {
305  wmsName = l->id();
306  }
307  else if ( !l->shortName().isEmpty() )
308  {
309  wmsName = l->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->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->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->keywordList().isEmpty() )
380  {
381  const QStringList keywordStringList = l->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->dataUrl();
401  if ( !dataUrl.isEmpty() )
402  {
403  QDomElement dataUrlElem = doc.createElement( QStringLiteral( "DataURL" ) );
404  const QString dataUrlFormat = l->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.
Definition: qgsexception.h:67
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.
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children)
Namespace with helper functions for layer tree operations.
Definition: qgslayertree.h:32
QStringList styles() const
Returns list of all defined style names.
Base class for all map layer types.
Definition: qgsmaplayer.h:75
QString name
Definition: qgsmaplayer.h:78
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:81
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString abstract() const
Returns the abstract of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:327
QString dataUrlFormat() const
Returns the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:378
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
Definition: qgsmaplayer.h:422
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:312
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:361
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.
Definition: qgsmaplayer.h:151
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.
QString keywordList() const
Returns the keyword list of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:342
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...
Definition: qgsproject.cpp:896
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.
Definition: qgsrectangle.h:42
double xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:201
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:211
double xMaximum() const
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:196
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:206
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle.
Definition: qgsrectangle.h:413
bool isEmpty() const
Returns true if the rectangle has no area.
Definition: qgsrectangle.h:492
void invert()
Swap x/y coordinates in the rectangle.
Definition: qgsrectangle.h:604
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 QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
virtual QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache 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.
Definition: qgswmsrequest.h:35
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.
Definition: qgswmsutils.cpp:38