QGIS API Documentation 3.99.0-Master (d270888f95f)
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 ***************************************************************************/
20
21#include "qgsmaplayer.h"
22#include "qgsproject.h"
23#include "qgsrasterlayer.h"
25#include "qgswcsutils.h"
26
27#include <QString>
28
29using namespace Qt::StringLiterals;
30
31namespace QgsWcs
32{
33
37 void writeDescribeCoverage( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response )
38 {
39#ifdef HAVE_SERVER_PYTHON_PLUGINS
40 QgsAccessControl *accessControl = serverIface->accessControls();
41#endif
42 QDomDocument doc;
43 const QDomDocument *describeDocument = nullptr;
44
45#ifdef HAVE_SERVER_PYTHON_PLUGINS
46 QgsServerCacheManager *cacheManager = serverIface->cacheManager();
47 if ( cacheManager && cacheManager->getCachedDocument( &doc, project, request, accessControl ) )
48 {
49 describeDocument = &doc;
50 }
51 else //describe feature xml not in cache. Create a new one
52 {
53 doc = createDescribeCoverageDocument( serverIface, project, version, request );
54
55 if ( cacheManager )
56 {
57 cacheManager->setCachedDocument( &doc, project, request, accessControl );
58 }
59 describeDocument = &doc;
60 }
61#else
62 doc = createDescribeCoverageDocument( serverIface, project, version, request );
63 describeDocument = &doc;
64#endif
65 response.setHeader( "Content-Type", "text/xml; charset=utf-8" );
66 response.write( describeDocument->toByteArray() );
67 }
68
69
70 QDomDocument createDescribeCoverageDocument( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request )
71 {
72 Q_UNUSED( version )
73
74 QDomDocument doc;
75
76 const QgsServerRequest::Parameters parameters = request.parameters();
77
78#ifdef HAVE_SERVER_PYTHON_PLUGINS
79 QgsAccessControl *accessControl = serverIface->accessControls();
80#else
81 ( void ) serverIface;
82#endif
83
84 //wcs:WCS_Capabilities element
85 QDomElement coveDescElement = doc.createElement( u"CoverageDescription"_s /*wcs:CoverageDescription*/ );
86 coveDescElement.setAttribute( u"xmlns"_s, WCS_NAMESPACE );
87 coveDescElement.setAttribute( u"xmlns:xsi"_s, u"http://www.w3.org/2001/XMLSchema-instance"_s );
88 coveDescElement.setAttribute( u"xsi:schemaLocation"_s, WCS_NAMESPACE + " http://schemas.opengis.net/wcs/1.0.0/describeCoverage.xsd" );
89 coveDescElement.setAttribute( u"xmlns:gml"_s, GML_NAMESPACE );
90 coveDescElement.setAttribute( u"xmlns:xlink"_s, u"http://www.w3.org/1999/xlink"_s );
91 coveDescElement.setAttribute( u"version"_s, u"1.0.0"_s );
92 coveDescElement.setAttribute( u"updateSequence"_s, u"0"_s );
93 doc.appendChild( coveDescElement );
94
95 //defining coverage name
96 QString coveNames;
97 //read COVERAGE
98 const QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( u"COVERAGE"_s );
99 if ( cove_name_it != parameters.constEnd() )
100 {
101 coveNames = cove_name_it.value();
102 }
103 if ( coveNames.isEmpty() )
104 {
105 const QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( u"IDENTIFIER"_s );
106 if ( cove_name_it != parameters.constEnd() )
107 {
108 coveNames = cove_name_it.value();
109 }
110 }
111
112 QStringList coveNameList;
113 if ( !coveNames.isEmpty() )
114 {
115 coveNameList = coveNames.split( ',' );
116 for ( int i = 0; i < coveNameList.size(); ++i )
117 {
118 coveNameList.replace( i, coveNameList.at( i ).trimmed() );
119 }
120 }
121
122 const QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
123 for ( int i = 0; i < wcsLayersId.size(); ++i )
124 {
125 QgsMapLayer *layer = project->mapLayer( wcsLayersId.at( i ) );
126 if ( !layer )
127 {
128 continue;
129 }
130 if ( layer->type() != Qgis::LayerType::Raster )
131 {
132 continue;
133 }
134#ifdef HAVE_SERVER_PYTHON_PLUGINS
135 if ( !accessControl->layerReadPermission( layer ) )
136 {
137 continue;
138 }
139#endif
140 QString name = layer->name();
141 if ( !layer->serverProperties()->shortName().isEmpty() )
142 name = layer->serverProperties()->shortName();
143 name = name.replace( ' ', '_' );
144
145 if ( coveNameList.size() == 0 || coveNameList.contains( name ) )
146 {
147 QgsRasterLayer *rLayer = qobject_cast<QgsRasterLayer *>( layer );
148 coveDescElement.appendChild( getCoverageOffering( doc, const_cast<QgsRasterLayer *>( rLayer ), project ) );
149 }
150 }
151 return doc;
152 }
153
154} // namespace QgsWcs
@ Raster
Raster layer.
Definition qgis.h:195
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:83
QString name
Definition qgsmaplayer.h:87
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
Qgis::LayerType type
Definition qgsmaplayer.h:93
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:112
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.
Defines 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.
static QStringList wcsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WCS.
Defines requests passed to QgsService classes.
QgsServerRequest::Parameters parameters() const
Returns a map of query parameters with keys converted to uppercase.
QMap< QString, QString > Parameters
Defines the response interface passed to QgsService.
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...
WCS implementation.
Definition qgswcs.cpp:34
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:65
QDomDocument createDescribeCoverageDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create describe coverage document.
const QString GML_NAMESPACE
Definition qgswcsutils.h:66