37     void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem, 
QgsMapLayer *currentLayer );
    39     void appendOwsLayersFromTreeGroup( QDomDocument &doc,
    40                                        QDomElement &parentLayer,
    46                                        const QString &strGroup );
    48     void appendOwsGeneralAndResourceList( QDomDocument &doc, QDomElement &parentElement,
    58 #ifdef HAVE_SERVER_PYTHON_PLUGINS    63     const QDomDocument *contextDocument = 
nullptr;
    66 #ifdef HAVE_SERVER_PYTHON_PLUGINS    69     if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
    71       contextDocument = &doc;
    75       doc = 
getContext( serverIface, project, version, request );
    81       contextDocument = &doc;
    84     response.
setHeader( QStringLiteral( 
"Content-Type" ), QStringLiteral( 
"text/xml; charset=utf-8" ) );
    85     response.
write( contextDocument->toByteArray() );
    95     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,
   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 );
   140       if ( !title.isEmpty() )
   142         QDomElement titleElem = doc.createElement( QStringLiteral( 
"ows:Title" ) );
   143         QDomText titleText = doc.createTextNode( title );
   144         titleElem.appendChild( titleText );
   145         generalElem.appendChild( titleElem );
   150       if ( !
abstract.isEmpty() )
   152         QDomElement abstractElem = doc.createElement( QStringLiteral( 
"ows:Abstract" ) );
   153         QDomText abstractText = doc.createCDATASection( 
abstract );
   154         abstractElem.appendChild( abstractText );
   155         generalElem.appendChild( abstractElem );
   160       if ( !keywords.isEmpty() )
   164         QDomElement keywordsElem = doc.createElement( QStringLiteral( 
"ows:Keywords" ) );
   166         for ( 
int i = 0; i < keywords.size(); ++i )
   168           QString keyword = keywords.at( i );
   169           if ( !keyword.isEmpty() )
   171             QDomElement keywordElem = doc.createElement( QStringLiteral( 
"ows:Keyword" ) );
   172             QDomText keywordText = doc.createTextNode( keyword );
   173             keywordElem.appendChild( keywordText );
   176               keywordElem.setAttribute( QStringLiteral( 
"vocabulary" ), QStringLiteral( 
"SIA_Geo405" ) );
   178             keywordsElem.appendChild( keywordElem );
   181         generalElem.appendChild( keywordsElem );
   185       parentElement.appendChild( generalElem );
   188       QDomElement resourceListElem = doc.createElement( QStringLiteral( 
"ResourceList" ) );
   191       appendOwsLayersFromTreeGroup( doc, resourceListElem, serverIface, project, request, projectLayerTreeRoot, combinedBBox, QString() );
   192       parentElement.appendChild( resourceListElem );
   199         mapRect = combinedBBox;
   201       QDomElement bboxElem = doc.createElement( QStringLiteral( 
"ows:BoundingBox" ) );
   202       bboxElem.setAttribute( QStringLiteral( 
"crs" ), projectCrs.
authid() );
   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 );
   218     void appendOwsLayersFromTreeGroup( QDomDocument &doc,
   219                                        QDomElement &parentLayer,
   225                                        const QString &strGroup )
   229       QList< QgsLayerTreeNode * > layerTreeGroupChildren = layerTreeGroup->
children();
   230       for ( 
int i = 0; i < layerTreeGroupChildren.size(); ++i )
   238           QString name = treeGroupChild->
name();
   239           if ( restrictedLayers.contains( name ) ) 
   245           if ( strGroup.isEmpty() )
   251             group = strGroup + 
"/" + name;
   254           appendOwsLayersFromTreeGroup( doc, parentLayer, serverIface, project, request, treeGroupChild, combinedBBox, group );
   260           if ( restrictedLayers.contains( l->
name() ) ) 
   271           QDomElement layerElem = doc.createElement( QStringLiteral( 
"Layer" ) );
   276             layerElem.setAttribute( QStringLiteral( 
"queryable" ), QStringLiteral( 
"false" ) );
   280             layerElem.setAttribute( QStringLiteral( 
"queryable" ), QStringLiteral( 
"true" ) );
   286             layerElem.setAttribute( QStringLiteral( 
"hidden" ), QStringLiteral( 
"true" ) );
   290             layerElem.setAttribute( QStringLiteral( 
"hidden" ), QStringLiteral( 
"false" ) );
   294           if ( !strGroup.isEmpty() )
   296             layerElem.setAttribute( QStringLiteral( 
"group" ), strGroup );
   301           layerElem.setAttribute( QStringLiteral( 
"opacity" ), 1 );
   303           QString wmsName = l->
name();
   313           layerElem.setAttribute( QStringLiteral( 
"name" ), wmsName );
   315           layerElem.setAttribute( QStringLiteral( 
"id" ), wmsName.replace( QRegExp( 
"[\\W]" ), QStringLiteral( 
"_" ) ) );
   318           QDomElement titleElem = doc.createElement( QStringLiteral( 
"ows:Title" ) );
   319           QString title = l->
title();
   320           if ( title.isEmpty() )
   324           QDomText titleText = doc.createTextNode( title );
   325           titleElem.appendChild( titleText );
   326           layerElem.appendChild( titleElem );
   329           QDomElement formatElem = doc.createElement( QStringLiteral( 
"ows:OutputFormat" ) );
   330           QDomText formatText = doc.createTextNode( QStringLiteral( 
"image/png" ) );
   331           formatElem.appendChild( formatText );
   332           layerElem.appendChild( formatElem );
   338           QString hrefString = href.toString();
   339           hrefString.append( href.hasQuery() ? 
"&" : 
"?" );
   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 );
   352           if ( !
abstract.isEmpty() )
   354             QDomElement abstractElem = doc.createElement( QStringLiteral( 
"ows:Abstract" ) );
   355             QDomText abstractText = doc.createTextNode( 
abstract );
   356             abstractElem.appendChild( abstractText );
   357             layerElem.appendChild( abstractElem );
   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 );
   376           appendOwsLayerStyles( doc, layerElem, l );
   381             QStringList keywordStringList = l->
keywordList().split( 
',' );
   384             QDomElement keywordsElem = doc.createElement( QStringLiteral( 
"ows:Keywords" ) );
   385             for ( 
int i = 0; i < keywordStringList.size(); ++i )
   387               QDomElement keywordElem = doc.createElement( QStringLiteral( 
"ows:Keyword" ) );
   388               QDomText keywordText = doc.createTextNode( keywordStringList.at( i ).trimmed() );
   389               keywordElem.appendChild( keywordText );
   392                 keywordElem.setAttribute( QStringLiteral( 
"vocabulary" ), QStringLiteral( 
"SIA_Geo405" ) );
   394               keywordsElem.appendChild( keywordElem );
   396             layerElem.appendChild( keywordsElem );
   400           QString dataUrl = l->
dataUrl();
   401           if ( !dataUrl.isEmpty() )
   403             QDomElement dataUrlElem = doc.createElement( QStringLiteral( 
"DataURL" ) );
   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 );
   416           if ( !metadataUrl.isEmpty() )
   418             QDomElement metaUrlElem = doc.createElement( QStringLiteral( 
"MetadataURL" ) );
   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 );
   448           if ( parentLayer.hasChildNodes() )
   450             parentLayer.insertBefore( layerElem, parentLayer.firstChild() );
   454             parentLayer.appendChild( layerElem );
   460     void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem, 
QgsMapLayer *currentLayer )
   464         QDomElement styleListElem = doc.createElement( QStringLiteral( 
"StyleList" ) );
   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 );
 Layer tree group node serves as a container for layers and further groups. 
 
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...
 
QString dataUrlFormat() const
Returns the DataUrl format of the layer used by QGIS Server in GetCapabilities request. 
 
A rectangle specified with double values. 
 
Base class for all map layer types. 
 
QStringList styles() const
Returns list of all defined style names. 
 
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children) 
 
SERVER_EXPORT QStringList owsServiceKeywords(const QgsProject &project)
Returns the owsService keywords defined in project. 
 
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer. 
 
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request. 
 
SERVER_EXPORT QString owsServiceAbstract(const QgsProject &project)
Returns the owsService abstract defined in project. 
 
QString abstract() const
Returns the abstract of the layer used by QGIS Server in GetCapabilities request. ...
 
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer. 
 
SERVER_EXPORT bool wmsInfoFormatSia2045(const QgsProject &project)
Returns if the info format is SIA20145. 
 
QDomDocument getContext(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Returns XML document for the 'GetContext' request. 
 
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device...
 
virtual QgsRectangle extent() const
Returns the extent of the layer. 
 
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager. 
 
QString metadataUrlFormat() const
Returns the metadata format of the layer used by QGIS Server in GetCapabilities request. 
 
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject. 
 
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent. 
 
Namespace with helper functions for layer tree operations. 
 
bool isEmpty() const
Returns true if the rectangle is empty. 
 
QString keywordList() const
Returns the keyword list of the layer used by QGIS Server in GetCapabilities request. 
 
QgsCoordinateReferenceSystem crs
 
void writeGetContext(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output GetContext response. 
 
A helper class that centralizes caches accesses given by all the server cache filter plugins...
 
This class is a base class for nodes in a layer tree. 
 
Reads and writes project states. 
 
double minimumScale() const
Returns the minimum map scale (i.e. 
 
double maximumScale() const
Returns the maximum map scale (i.e. 
 
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. 
 
NodeType nodeType() const
Find out about type of the node. It is usually shorter to use convenience functions from QgsLayerTree...
 
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request. 
 
Median cut implementation. 
 
double yMinimum() const
Returns the y minimum value (bottom side of rectangle). 
 
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree. 
 
double xMaximum() const
Returns the x maximum value (right side of rectangle). 
 
QgsMapLayer * layer() const
Returns the map layer associated with this node. 
 
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle...
 
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
 
bool layerReadPermission(const QgsMapLayer *layer) const
Returns the layer read right. 
 
QgsServerInterface Class defining interfaces exposed by QGIS Server and made available to plugins...
 
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer. 
 
SERVER_EXPORT QgsRectangle wmsExtent(const QgsProject &project)
Returns the WMS Extent restriction. 
 
bool hasAxisInverted() const
Returns whether axis is inverted (e.g., for WMS 1.3) for the CRS. 
 
This class represents a coordinate reference system (CRS). 
 
bool setCachedDocument(const QDomDocument *doc, const QgsProject *project, const QgsServerRequest &request, QgsAccessControl *accessControl) const
Updates or inserts the document in cache like capabilities. 
 
virtual QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache filters. 
 
QUrl serviceUrl(const QgsServerRequest &request, const QgsProject *project)
Returns WMS service URL. 
 
double xMinimum() const
Returns the x minimum value (left side of rectangle). 
 
A helper class that centralizes restrictions given by all the access control filter plugins...
 
QString metadataUrl() const
Returns the metadata URL of the layer used by QGIS Server in GetCapabilities request. 
 
double yMaximum() const
Returns the y maximum value (top side of rectangle). 
 
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
 
QString name() const override
Returns the group's name. 
 
Custom exception class for Coordinate Reference System related exceptions. 
 
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters. 
 
QString baseName() const
Returns the base name of the project file without the path and without extension - derived from fileN...
 
SERVER_EXPORT QStringList wmsRestrictedLayers(const QgsProject &project)
Returns the restricted layer name list. 
 
Container of other groups and layers. 
 
If the layer is identifiable using the identify map tool and as a WMS layer. 
 
QString authid() const
Returns the authority identifier for the CRS. 
 
SERVER_EXPORT QString owsServiceTitle(const QgsProject &project)
Returns the owsService title defined in project. 
 
QgsCoordinateReferenceSystem crs
 
void invert()
Swap x/y coordinates in the rectangle. 
 
Layer tree node points to a map layer. 
 
SERVER_EXPORT bool wmsUseLayerIds(const QgsProject &project)
Returns if layer ids are used as name in WMS.