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,
57 #ifdef HAVE_SERVER_PYTHON_PLUGINS 62 const QDomDocument *contextDocument =
nullptr;
64 #ifdef HAVE_SERVER_PYTHON_PLUGINS 66 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
68 contextDocument = &doc;
72 doc =
getContext( serverIface, project, version, request );
78 contextDocument = &doc;
81 doc =
getContext( serverIface, project, version, request );
83 response.
setHeader( QStringLiteral(
"Content-Type" ), QStringLiteral(
"text/xml; charset=utf-8" ) );
84 response.
write( contextDocument->toByteArray() );
94 QDomProcessingInstruction xmlDeclaration = doc.createProcessingInstruction( QStringLiteral(
"xml" ),
95 QStringLiteral(
"version=\"1.0\" encoding=\"utf-8\"" ) );
97 doc.appendChild( xmlDeclaration );
99 QDomElement owsContextElem = doc.createElement( QStringLiteral(
"OWSContext" ) );
100 owsContextElem.setAttribute( QStringLiteral(
"xmlns" ), QStringLiteral(
"http://www.opengis.net/ows-context" ) );
101 owsContextElem.setAttribute( QStringLiteral(
"xmlns:ows-context" ), QStringLiteral(
"http://www.opengis.net/ows-context" ) );
102 owsContextElem.setAttribute( QStringLiteral(
"xmlns:context" ), QStringLiteral(
"http://www.opengis.net/context" ) );
103 owsContextElem.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
104 owsContextElem.setAttribute( QStringLiteral(
"xmlns:sld" ), QStringLiteral(
"http://www.opengis.net/sld" ) );
105 owsContextElem.setAttribute( QStringLiteral(
"xmlns:ogc" ), QStringLiteral(
"http://www.opengis.net/ogc" ) );
106 owsContextElem.setAttribute( QStringLiteral(
"xmlns:gml" ), QStringLiteral(
"http://www.opengis.net/gml" ) );
107 owsContextElem.setAttribute( QStringLiteral(
"xmlns:kml" ), QStringLiteral(
"http://www.opengis.net/kml/2.2" ) );
108 owsContextElem.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
109 owsContextElem.setAttribute( QStringLiteral(
"xmlns:ns9" ), QStringLiteral(
"http://www.w3.org/2005/Atom" ) );
110 owsContextElem.setAttribute( QStringLiteral(
"xmlns:xal" ), QStringLiteral(
"urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" ) );
111 owsContextElem.setAttribute( QStringLiteral(
"xmlns:ins" ), QStringLiteral(
"http://www.inspire.org" ) );
112 owsContextElem.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"0.3.1" ) );
113 doc.appendChild( owsContextElem );
115 appendOwsGeneralAndResourceList( doc, owsContextElem, serverIface, project, request );
121 void appendOwsGeneralAndResourceList( QDomDocument &doc, QDomElement &parentElement,
125 parentElement.setAttribute( QStringLiteral(
"id" ),
"ows-context-" + project->
baseName() );
128 QDomElement generalElem = doc.createElement( QStringLiteral(
"General" ) );
131 QDomElement windowElem = doc.createElement( QStringLiteral(
"Window" ) );
132 windowElem.setAttribute( QStringLiteral(
"height" ), QStringLiteral(
"600" ) );
133 windowElem.setAttribute( QStringLiteral(
"width" ), QStringLiteral(
"800" ) );
134 generalElem.appendChild( windowElem );
139 if ( !title.isEmpty() )
141 QDomElement titleElem = doc.createElement( QStringLiteral(
"ows:Title" ) );
142 QDomText titleText = doc.createTextNode( title );
143 titleElem.appendChild( titleText );
144 generalElem.appendChild( titleElem );
149 if ( !
abstract.isEmpty() )
151 QDomElement abstractElem = doc.createElement( QStringLiteral(
"ows:Abstract" ) );
152 QDomText abstractText = doc.createCDATASection(
abstract );
153 abstractElem.appendChild( abstractText );
154 generalElem.appendChild( abstractElem );
159 if ( !keywords.isEmpty() )
163 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"ows:Keywords" ) );
165 for (
int i = 0; i < keywords.size(); ++i )
167 QString keyword = keywords.at( i );
168 if ( !keyword.isEmpty() )
170 QDomElement keywordElem = doc.createElement( QStringLiteral(
"ows:Keyword" ) );
171 QDomText keywordText = doc.createTextNode( keyword );
172 keywordElem.appendChild( keywordText );
175 keywordElem.setAttribute( QStringLiteral(
"vocabulary" ), QStringLiteral(
"SIA_Geo405" ) );
177 keywordsElem.appendChild( keywordElem );
180 generalElem.appendChild( keywordsElem );
184 parentElement.appendChild( generalElem );
187 QDomElement resourceListElem = doc.createElement( QStringLiteral(
"ResourceList" ) );
190 appendOwsLayersFromTreeGroup( doc, resourceListElem, serverIface, project, request, projectLayerTreeRoot, combinedBBox, QString() );
191 parentElement.appendChild( resourceListElem );
198 mapRect = combinedBBox;
200 QDomElement bboxElem = doc.createElement( QStringLiteral(
"ows:BoundingBox" ) );
201 bboxElem.setAttribute( QStringLiteral(
"crs" ), projectCrs.
authid() );
206 QDomElement lowerCornerElem = doc.createElement( QStringLiteral(
"ows:LowerCorner" ) );
207 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 QDomText upperCornerText = doc.createTextNode( QString::number( mapRect.
xMaximum() ) +
" " + QString::number( mapRect.
yMaximum() ) );
212 upperCornerElem.appendChild( upperCornerText );
213 bboxElem.appendChild( upperCornerElem );
214 generalElem.appendChild( bboxElem );
217 void appendOwsLayersFromTreeGroup( QDomDocument &doc,
218 QDomElement &parentLayer,
224 const QString &strGroup )
228 QList< QgsLayerTreeNode * > layerTreeGroupChildren = layerTreeGroup->
children();
229 for (
int i = 0; i < layerTreeGroupChildren.size(); ++i )
237 QString name = treeGroupChild->
name();
238 if ( restrictedLayers.contains( name ) )
244 if ( strGroup.isEmpty() )
250 group = strGroup +
"/" + name;
253 appendOwsLayersFromTreeGroup( doc, parentLayer, serverIface, project, request, treeGroupChild, combinedBBox, group );
259 if ( restrictedLayers.contains( l->
name() ) )
263 #ifdef HAVE_SERVER_PYTHON_PLUGINS 270 QDomElement layerElem = doc.createElement( QStringLiteral(
"Layer" ) );
275 layerElem.setAttribute( QStringLiteral(
"queryable" ), QStringLiteral(
"false" ) );
279 layerElem.setAttribute( QStringLiteral(
"queryable" ), QStringLiteral(
"true" ) );
285 layerElem.setAttribute( QStringLiteral(
"hidden" ), QStringLiteral(
"false" ) );
289 layerElem.setAttribute( QStringLiteral(
"hidden" ), QStringLiteral(
"true" ) );
293 if ( !strGroup.isEmpty() )
295 layerElem.setAttribute( QStringLiteral(
"group" ), strGroup );
300 layerElem.setAttribute( QStringLiteral(
"opacity" ), 1 );
302 QString wmsName = l->
name();
312 layerElem.setAttribute( QStringLiteral(
"name" ), wmsName );
314 layerElem.setAttribute( QStringLiteral(
"id" ), wmsName.replace( QRegExp(
"[\\W]" ), QStringLiteral(
"_" ) ) );
317 QDomElement titleElem = doc.createElement( QStringLiteral(
"ows:Title" ) );
318 QString title = l->
title();
319 if ( title.isEmpty() )
323 QDomText titleText = doc.createTextNode( title );
324 titleElem.appendChild( titleText );
325 layerElem.appendChild( titleElem );
328 QDomElement formatElem = doc.createElement( QStringLiteral(
"ows:OutputFormat" ) );
329 QDomText formatText = doc.createTextNode( QStringLiteral(
"image/png" ) );
330 formatElem.appendChild( formatText );
331 layerElem.appendChild( formatElem );
337 QString hrefString = href.toString();
338 hrefString.append( href.hasQuery() ?
"&" :
"?" );
341 QDomElement serverElem = doc.createElement( QStringLiteral(
"Server" ) );
342 serverElem.setAttribute( QStringLiteral(
"service" ), QStringLiteral(
"urn:ogc:serviceType:WMS" ) );
343 serverElem.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.3.0" ) );
344 serverElem.setAttribute( QStringLiteral(
"default" ), QStringLiteral(
"true" ) );
345 QDomElement orServerElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
346 orServerElem.setAttribute( QStringLiteral(
"xlink:href" ), hrefString );
347 serverElem.appendChild( orServerElem );
348 layerElem.appendChild( serverElem );
351 if ( !
abstract.isEmpty() )
353 QDomElement abstractElem = doc.createElement( QStringLiteral(
"ows:Abstract" ) );
354 QDomText abstractText = doc.createTextNode(
abstract );
355 abstractElem.appendChild( abstractText );
356 layerElem.appendChild( abstractElem );
362 QString minScaleString = QString::number( l->
maximumScale() );
363 QString maxScaleString = QString::number( l->
minimumScale() );
364 QDomElement minScaleElem = doc.createElement( QStringLiteral(
"sld:MinScaleDenominator" ) );
365 QDomText minScaleText = doc.createTextNode( minScaleString );
366 minScaleElem.appendChild( minScaleText );
367 layerElem.appendChild( minScaleElem );
368 QDomElement maxScaleElem = doc.createElement( QStringLiteral(
"sld:MaxScaleDenominator" ) );
369 QDomText maxScaleText = doc.createTextNode( maxScaleString );
370 maxScaleElem.appendChild( maxScaleText );
371 layerElem.appendChild( maxScaleElem );
375 appendOwsLayerStyles( doc, layerElem, l );
380 QStringList keywordStringList = l->
keywordList().split(
',' );
383 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"ows:Keywords" ) );
384 for (
int i = 0; i < keywordStringList.size(); ++i )
386 QDomElement keywordElem = doc.createElement( QStringLiteral(
"ows:Keyword" ) );
387 QDomText keywordText = doc.createTextNode( keywordStringList.at( i ).trimmed() );
388 keywordElem.appendChild( keywordText );
391 keywordElem.setAttribute( QStringLiteral(
"vocabulary" ), QStringLiteral(
"SIA_Geo405" ) );
393 keywordsElem.appendChild( keywordElem );
395 layerElem.appendChild( keywordsElem );
399 QString dataUrl = l->
dataUrl();
400 if ( !dataUrl.isEmpty() )
402 QDomElement dataUrlElem = doc.createElement( QStringLiteral(
"DataURL" ) );
404 dataUrlElem.setAttribute( QStringLiteral(
"format" ), dataUrlFormat );
405 QDomElement dataORElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
406 dataORElem.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
407 dataORElem.setAttribute( QStringLiteral(
"xlink:type" ), QStringLiteral(
"simple" ) );
408 dataORElem.setAttribute( QStringLiteral(
"xlink:href" ), dataUrl );
409 dataUrlElem.appendChild( dataORElem );
410 layerElem.appendChild( dataUrlElem );
415 if ( !metadataUrl.isEmpty() )
417 QDomElement metaUrlElem = doc.createElement( QStringLiteral(
"MetadataURL" ) );
419 metaUrlElem.setAttribute( QStringLiteral(
"format" ), metadataUrlFormat );
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" ), metadataUrl );
424 metaUrlElem.appendChild( metaUrlORElem );
425 layerElem.appendChild( metaUrlElem );
447 if ( parentLayer.hasChildNodes() )
449 parentLayer.insertBefore( layerElem, parentLayer.firstChild() );
453 parentLayer.appendChild( layerElem );
459 void appendOwsLayerStyles( QDomDocument &doc, QDomElement &layerElem,
QgsMapLayer *currentLayer )
463 QDomElement styleListElem = doc.createElement( QStringLiteral(
"StyleList" ) );
465 QDomElement styleElem = doc.createElement( QStringLiteral(
"Style" ) );
466 styleElem.setAttribute( QStringLiteral(
"current" ), QStringLiteral(
"true" ) );
467 QDomElement styleNameElem = doc.createElement( QStringLiteral(
"Name" ) );
468 QDomText styleNameText = doc.createTextNode( styleName );
469 styleNameElem.appendChild( styleNameText );
470 QDomElement styleTitleElem = doc.createElement( QStringLiteral(
"Title" ) );
471 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 );
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.