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.