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