38 void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem,
QgsMapLayer *currentLayer );
40 void appendOwsLayersFromTreeGroup( QDomDocument &doc,
41 QDomElement &parentLayer,
44 const QgsWmsRequest &request,
47 const QString &strGroup );
49 void appendOwsGeneralAndResourceList( QDomDocument &doc, QDomElement &parentElement,
51 const QgsWmsRequest &request );
58 #ifdef HAVE_SERVER_PYTHON_PLUGINS
63 const QDomDocument *contextDocument =
nullptr;
65 #ifdef HAVE_SERVER_PYTHON_PLUGINS
67 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
69 contextDocument = &doc;
73 doc =
getContext( serverIface, project, request );
79 contextDocument = &doc;
82 doc =
getContext( serverIface, project, request );
83 contextDocument = &doc;
85 response.
setHeader( QStringLiteral(
"Content-Type" ), QStringLiteral(
"text/xml; charset=utf-8" ) );
86 response.
write( contextDocument->toByteArray() );
95 const QDomProcessingInstruction xmlDeclaration = doc.createProcessingInstruction( QStringLiteral(
"xml" ),
96 QStringLiteral(
"version=\"1.0\" encoding=\"utf-8\"" ) );
98 doc.appendChild( xmlDeclaration );
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 );
116 appendOwsGeneralAndResourceList( doc, owsContextElem, serverIface, project, request );
122 void appendOwsGeneralAndResourceList( QDomDocument &doc, QDomElement &parentElement,
124 const QgsWmsRequest &request )
126 parentElement.setAttribute( QStringLiteral(
"id" ),
"ows-context-" + project->
baseName() );
129 QDomElement generalElem = doc.createElement( QStringLiteral(
"General" ) );
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 );
139 QDomElement titleElem = doc.createElement( QStringLiteral(
"ows:Title" ) );
140 const QDomText titleText = doc.createTextNode( title );
141 titleElem.appendChild( titleText );
142 generalElem.appendChild( titleElem );
146 if ( !
abstract.isEmpty() )
148 QDomElement abstractElem = doc.createElement( QStringLiteral(
"ows:Abstract" ) );
149 const QDomText abstractText = doc.createCDATASection(
abstract );
150 abstractElem.appendChild( abstractText );
151 generalElem.appendChild( abstractElem );
156 if ( !keywords.isEmpty() )
160 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"ows:Keywords" ) );
162 for (
int i = 0; i < keywords.size(); ++i )
164 const QString keyword = keywords.at( i );
165 if ( !keyword.isEmpty() )
167 QDomElement keywordElem = doc.createElement( QStringLiteral(
"ows:Keyword" ) );
168 const QDomText keywordText = doc.createTextNode( keyword );
169 keywordElem.appendChild( keywordText );
172 keywordElem.setAttribute( QStringLiteral(
"vocabulary" ), QStringLiteral(
"SIA_Geo405" ) );
174 keywordsElem.appendChild( keywordElem );
177 generalElem.appendChild( keywordsElem );
181 parentElement.appendChild( generalElem );
184 QDomElement resourceListElem = doc.createElement( QStringLiteral(
"ResourceList" ) );
187 appendOwsLayersFromTreeGroup( doc, resourceListElem, serverIface, project, request, projectLayerTreeRoot, combinedBBox, QString() );
188 parentElement.appendChild( resourceListElem );
195 mapRect = combinedBBox;
197 QDomElement bboxElem = doc.createElement( QStringLiteral(
"ows:BoundingBox" ) );
198 bboxElem.setAttribute( QStringLiteral(
"crs" ), projectCrs.
authid() );
203 QDomElement lowerCornerElem = doc.createElement( QStringLiteral(
"ows:LowerCorner" ) );
204 const QDomText lowerCornerText = doc.createTextNode( QString::number( mapRect.
xMinimum() ) +
" " + QString::number( mapRect.
yMinimum() ) );
205 lowerCornerElem.appendChild( lowerCornerText );
206 bboxElem.appendChild( lowerCornerElem );
207 QDomElement upperCornerElem = doc.createElement( QStringLiteral(
"ows:UpperCorner" ) );
208 const QDomText upperCornerText = doc.createTextNode( QString::number( mapRect.
xMaximum() ) +
" " + QString::number( mapRect.
yMaximum() ) );
209 upperCornerElem.appendChild( upperCornerText );
210 bboxElem.appendChild( upperCornerElem );
211 generalElem.appendChild( bboxElem );
214 void appendOwsLayersFromTreeGroup( QDomDocument &doc,
215 QDomElement &parentLayer,
218 const QgsWmsRequest &request,
221 const QString &strGroup )
225 const QList< QgsLayerTreeNode * > layerTreeGroupChildren = layerTreeGroup->
children();
226 for (
int i = 0; i < layerTreeGroupChildren.size(); ++i )
234 const QString name = treeGroupChild->
name();
235 if ( restrictedLayers.contains( name ) )
241 if ( strGroup.isEmpty() )
247 group = strGroup +
"/" + name;
250 appendOwsLayersFromTreeGroup( doc, parentLayer, serverIface, project, request, treeGroupChild, combinedBBox, group );
256 if ( restrictedLayers.contains( l->
name() ) )
260 #ifdef HAVE_SERVER_PYTHON_PLUGINS
267 QDomElement layerElem = doc.createElement( QStringLiteral(
"Layer" ) );
272 layerElem.setAttribute( QStringLiteral(
"queryable" ), QStringLiteral(
"false" ) );
276 layerElem.setAttribute( QStringLiteral(
"queryable" ), QStringLiteral(
"true" ) );
282 layerElem.setAttribute( QStringLiteral(
"hidden" ), QStringLiteral(
"false" ) );
286 layerElem.setAttribute( QStringLiteral(
"hidden" ), QStringLiteral(
"true" ) );
290 if ( !strGroup.isEmpty() )
292 layerElem.setAttribute( QStringLiteral(
"group" ), strGroup );
297 layerElem.setAttribute( QStringLiteral(
"opacity" ), 1 );
299 QString wmsName = l->
name();
309 layerElem.setAttribute( QStringLiteral(
"name" ), wmsName );
311 layerElem.setAttribute( QStringLiteral(
"id" ), wmsName.replace( QRegExp(
"[\\W]" ), QStringLiteral(
"_" ) ) );
314 QDomElement titleElem = doc.createElement( QStringLiteral(
"ows:Title" ) );
315 QString title = l->
title();
316 if ( title.isEmpty() )
320 const QDomText titleText = doc.createTextNode( title );
321 titleElem.appendChild( titleText );
322 layerElem.appendChild( titleElem );
325 QDomElement formatElem = doc.createElement( QStringLiteral(
"ows:OutputFormat" ) );
326 const QDomText formatText = doc.createTextNode( QStringLiteral(
"image/png" ) );
327 formatElem.appendChild( formatText );
328 layerElem.appendChild( formatElem );
334 QString hrefString = href.toString();
335 hrefString.append( href.hasQuery() ?
"&" :
"?" );
338 QDomElement serverElem = doc.createElement( QStringLiteral(
"Server" ) );
339 serverElem.setAttribute( QStringLiteral(
"service" ), QStringLiteral(
"urn:ogc:serviceType:WMS" ) );
340 serverElem.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.3.0" ) );
341 serverElem.setAttribute( QStringLiteral(
"default" ), QStringLiteral(
"true" ) );
342 QDomElement orServerElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
343 orServerElem.setAttribute( QStringLiteral(
"xlink:href" ), hrefString );
344 serverElem.appendChild( orServerElem );
345 layerElem.appendChild( serverElem );
347 const QString
abstract = l->
abstract();
348 if ( !
abstract.isEmpty() )
350 QDomElement abstractElem = doc.createElement( QStringLiteral(
"ows:Abstract" ) );
351 const QDomText abstractText = doc.createTextNode(
abstract );
352 abstractElem.appendChild( abstractText );
353 layerElem.appendChild( abstractElem );
359 const QString minScaleString = QString::number( l->
maximumScale() );
360 const QString maxScaleString = QString::number( l->
minimumScale() );
361 QDomElement minScaleElem = doc.createElement( QStringLiteral(
"sld:MinScaleDenominator" ) );
362 const QDomText minScaleText = doc.createTextNode( minScaleString );
363 minScaleElem.appendChild( minScaleText );
364 layerElem.appendChild( minScaleElem );
365 QDomElement maxScaleElem = doc.createElement( QStringLiteral(
"sld:MaxScaleDenominator" ) );
366 const QDomText maxScaleText = doc.createTextNode( maxScaleString );
367 maxScaleElem.appendChild( maxScaleText );
368 layerElem.appendChild( maxScaleElem );
372 appendOwsLayerStyles( doc, layerElem, l );
377 const QStringList keywordStringList = l->
keywordList().split(
',' );
380 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"ows:Keywords" ) );
381 for (
int i = 0; i < keywordStringList.size(); ++i )
383 QDomElement keywordElem = doc.createElement( QStringLiteral(
"ows:Keyword" ) );
384 const QDomText keywordText = doc.createTextNode( keywordStringList.at( i ).trimmed() );
385 keywordElem.appendChild( keywordText );
388 keywordElem.setAttribute( QStringLiteral(
"vocabulary" ), QStringLiteral(
"SIA_Geo405" ) );
390 keywordsElem.appendChild( keywordElem );
392 layerElem.appendChild( keywordsElem );
396 const QString dataUrl = l->
dataUrl();
397 if ( !dataUrl.isEmpty() )
399 QDomElement dataUrlElem = doc.createElement( QStringLiteral(
"DataURL" ) );
401 dataUrlElem.setAttribute( QStringLiteral(
"format" ), dataUrlFormat );
402 QDomElement dataORElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
403 dataORElem.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
404 dataORElem.setAttribute( QStringLiteral(
"xlink:type" ), QStringLiteral(
"simple" ) );
405 dataORElem.setAttribute( QStringLiteral(
"xlink:href" ), dataUrl );
406 dataUrlElem.appendChild( dataORElem );
407 layerElem.appendChild( dataUrlElem );
414 QDomElement metaUrlElem = doc.createElement( QStringLiteral(
"MetadataURL" ) );
415 metaUrlElem.setAttribute( QStringLiteral(
"format" ), url.format );
416 QDomElement metaUrlORElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
417 metaUrlORElem.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
418 metaUrlORElem.setAttribute( QStringLiteral(
"xlink:type" ), QStringLiteral(
"simple" ) );
419 metaUrlORElem.setAttribute( QStringLiteral(
"xlink:href" ), url.url );
420 metaUrlElem.appendChild( metaUrlORElem );
421 layerElem.appendChild( metaUrlElem );
443 if ( parentLayer.hasChildNodes() )
445 parentLayer.insertBefore( layerElem, parentLayer.firstChild() );
449 parentLayer.appendChild( layerElem );
455 void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem,
QgsMapLayer *currentLayer )
459 QDomElement styleListElem = doc.createElement( QStringLiteral(
"StyleList" ) );
461 QDomElement styleElem = doc.createElement( QStringLiteral(
"Style" ) );
462 styleElem.setAttribute( QStringLiteral(
"current" ), QStringLiteral(
"true" ) );
463 QDomElement styleNameElem = doc.createElement( QStringLiteral(
"Name" ) );
464 const QDomText styleNameText = doc.createTextNode( styleName );
465 styleNameElem.appendChild( styleNameText );
466 QDomElement styleTitleElem = doc.createElement( QStringLiteral(
"Title" ) );
467 const QDomText styleTitleText = doc.createTextNode( styleName );
468 styleTitleElem.appendChild( styleTitleText );
469 styleElem.appendChild( styleNameElem );
470 styleElem.appendChild( styleTitleElem );
471 styleListElem.appendChild( styleElem );
472 layerElem.appendChild( styleListElem );
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 axis is inverted (e.g., for WMS 1.3) for the CRS.
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.
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.
QStringList styles() const
Returns list of all defined style names.
Base class for all map layer types.
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
QgsCoordinateReferenceSystem crs
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.
QString dataUrlFormat() const
Returns the DataUrl format of the layer used by QGIS Server in GetCapabilities request.
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
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.
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request.
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.
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.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
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
A rectangle specified with double values.
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom 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 is empty.
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 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.
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.