QGIS API Documentation 3.41.0-Master (cea29feecf2)
Loading...
Searching...
No Matches
qgswcsdescribecoverage.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgswcsdescribecoverage.cpp
3 -------------------------
4 begin : January 16 , 2017
5 copyright : (C) 2013 by René-Luc D'Hont ( parts from qgswcsserver )
6 (C) 2017 by David Marteau
7 email : rldhont at 3liz dot com
8 david dot marteau at 3liz dot com
9 ***************************************************************************/
10
11/***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 * *
18 ***************************************************************************/
19#include "qgswcsutils.h"
22
23#include "qgsproject.h"
24#include "qgsmaplayer.h"
25#include "qgsrasterlayer.h"
26
27namespace QgsWcs
28{
29
33 void writeDescribeCoverage( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response )
34 {
35#ifdef HAVE_SERVER_PYTHON_PLUGINS
36 QgsAccessControl *accessControl = serverIface->accessControls();
37#endif
38 QDomDocument doc;
39 const QDomDocument *describeDocument = nullptr;
40
41#ifdef HAVE_SERVER_PYTHON_PLUGINS
42 QgsServerCacheManager *cacheManager = serverIface->cacheManager();
43 if ( cacheManager && cacheManager->getCachedDocument( &doc, project, request, accessControl ) )
44 {
45 describeDocument = &doc;
46 }
47 else //describe feature xml not in cache. Create a new one
48 {
49 doc = createDescribeCoverageDocument( serverIface, project, version, request );
50
51 if ( cacheManager )
52 {
53 cacheManager->setCachedDocument( &doc, project, request, accessControl );
54 }
55 describeDocument = &doc;
56 }
57#else
58 doc = createDescribeCoverageDocument( serverIface, project, version, request );
59 describeDocument = &doc;
60#endif
61 response.setHeader( "Content-Type", "text/xml; charset=utf-8" );
62 response.write( describeDocument->toByteArray() );
63 }
64
65
66 QDomDocument createDescribeCoverageDocument( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request )
67 {
68 Q_UNUSED( version )
69
70 QDomDocument doc;
71
72 const QgsServerRequest::Parameters parameters = request.parameters();
73
74#ifdef HAVE_SERVER_PYTHON_PLUGINS
75 QgsAccessControl *accessControl = serverIface->accessControls();
76#else
77 ( void ) serverIface;
78#endif
79
80 //wcs:WCS_Capabilities element
81 QDomElement coveDescElement = doc.createElement( QStringLiteral( "CoverageDescription" ) /*wcs:CoverageDescription*/ );
82 coveDescElement.setAttribute( QStringLiteral( "xmlns" ), WCS_NAMESPACE );
83 coveDescElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
84 coveDescElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), WCS_NAMESPACE + " http://schemas.opengis.net/wcs/1.0.0/describeCoverage.xsd" );
85 coveDescElement.setAttribute( QStringLiteral( "xmlns:gml" ), GML_NAMESPACE );
86 coveDescElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
87 coveDescElement.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0.0" ) );
88 coveDescElement.setAttribute( QStringLiteral( "updateSequence" ), QStringLiteral( "0" ) );
89 doc.appendChild( coveDescElement );
90
91 //defining coverage name
92 QString coveNames;
93 //read COVERAGE
94 const QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( QStringLiteral( "COVERAGE" ) );
95 if ( cove_name_it != parameters.constEnd() )
96 {
97 coveNames = cove_name_it.value();
98 }
99 if ( coveNames.isEmpty() )
100 {
101 const QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( QStringLiteral( "IDENTIFIER" ) );
102 if ( cove_name_it != parameters.constEnd() )
103 {
104 coveNames = cove_name_it.value();
105 }
106 }
107
108 QStringList coveNameList;
109 if ( !coveNames.isEmpty() )
110 {
111 coveNameList = coveNames.split( ',' );
112 for ( int i = 0; i < coveNameList.size(); ++i )
113 {
114 coveNameList.replace( i, coveNameList.at( i ).trimmed() );
115 }
116 }
117
118 const QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
119 for ( int i = 0; i < wcsLayersId.size(); ++i )
120 {
121 QgsMapLayer *layer = project->mapLayer( wcsLayersId.at( i ) );
122 if ( !layer )
123 {
124 continue;
125 }
126 if ( layer->type() != Qgis::LayerType::Raster )
127 {
128 continue;
129 }
130#ifdef HAVE_SERVER_PYTHON_PLUGINS
131 if ( !accessControl->layerReadPermission( layer ) )
132 {
133 continue;
134 }
135#endif
136 QString name = layer->name();
137 if ( !layer->serverProperties()->shortName().isEmpty() )
138 name = layer->serverProperties()->shortName();
139 name = name.replace( ' ', '_' );
140
141 if ( coveNameList.size() == 0 || coveNameList.contains( name ) )
142 {
143 QgsRasterLayer *rLayer = qobject_cast<QgsRasterLayer *>( layer );
144 coveDescElement.appendChild( getCoverageOffering( doc, const_cast<QgsRasterLayer *>( rLayer ), project ) );
145 }
146 }
147 return doc;
148 }
149
150} // namespace QgsWcs
@ Raster
Raster layer.
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.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
Base class for all map layer types.
Definition qgsmaplayer.h:76
QString name
Definition qgsmaplayer.h:80
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
Qgis::LayerType type
Definition qgsmaplayer.h:86
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:107
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
Represents a raster layer.
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 QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache filters.
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
QgsServerRequest::Parameters parameters() const
Returns a map of query parameters with keys converted to uppercase.
QMap< QString, QString > Parameters
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...
SERVER_EXPORT QStringList wcsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WCS.
WCS implementation.
Definition qgswcs.cpp:30
QDomElement getCoverageOffering(QDomDocument &doc, const QgsRasterLayer *layer, const QgsProject *project, bool brief)
CoverageOffering or CoverageOfferingBrief element.
void writeDescribeCoverage(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WCS DescribeCoverage response.
const QString WCS_NAMESPACE
Definition qgswcsutils.h:63
QDomDocument createDescribeCoverageDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create describe coverage document.
const QString GML_NAMESPACE
Definition qgswcsutils.h:64