QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
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"
20 #include "qgsserverprojectutils.h"
21 #include "qgswcsdescribecoverage.h"
22 
23 #include "qgsproject.h"
24 #include "qgsmaplayer.h"
25 #include "qgsrasterlayer.h"
26 
27 namespace QgsWcs
28 {
29 
33  void writeDescribeCoverage( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
34  const QgsServerRequest &request, QgsServerResponse &response )
35  {
36 #ifdef HAVE_SERVER_PYTHON_PLUGINS
37  QgsAccessControl *accessControl = serverIface->accessControls();
38 #endif
39  QDomDocument doc;
40  const QDomDocument *describeDocument = nullptr;
41 
42 #ifdef HAVE_SERVER_PYTHON_PLUGINS
43  QgsServerCacheManager *cacheManager = serverIface->cacheManager();
44  if ( cacheManager && cacheManager->getCachedDocument( &doc, project, request, accessControl ) )
45  {
46  describeDocument = &doc;
47  }
48  else //describe feature xml not in cache. Create a new one
49  {
50  doc = createDescribeCoverageDocument( serverIface, project, version, request );
51 
52  if ( cacheManager )
53  {
54  cacheManager->setCachedDocument( &doc, project, request, accessControl );
55  }
56  describeDocument = &doc;
57  }
58 #else
59  doc = createDescribeCoverageDocument( serverIface, project, version, request );
60  describeDocument = &doc;
61 #endif
62  response.setHeader( "Content-Type", "text/xml; charset=utf-8" );
63  response.write( describeDocument->toByteArray() );
64  }
65 
66 
67  QDomDocument createDescribeCoverageDocument( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
68  const QgsServerRequest &request )
69  {
70  Q_UNUSED( version )
71 
72  QDomDocument doc;
73 
74  QgsServerRequest::Parameters parameters = request.parameters();
75 
76 #ifdef HAVE_SERVER_PYTHON_PLUGINS
77  QgsAccessControl *accessControl = serverIface->accessControls();
78 #else
79  ( void )serverIface;
80 #endif
81 
82  //wcs:WCS_Capabilities element
83  QDomElement coveDescElement = doc.createElement( QStringLiteral( "CoverageDescription" )/*wcs:CoverageDescription*/ );
84  coveDescElement.setAttribute( QStringLiteral( "xmlns" ), WCS_NAMESPACE );
85  coveDescElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
86  coveDescElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), WCS_NAMESPACE + " http://schemas.opengis.net/wcs/1.0.0/describeCoverage.xsd" );
87  coveDescElement.setAttribute( QStringLiteral( "xmlns:gml" ), GML_NAMESPACE );
88  coveDescElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
89  coveDescElement.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0.0" ) );
90  coveDescElement.setAttribute( QStringLiteral( "updateSequence" ), QStringLiteral( "0" ) );
91  doc.appendChild( coveDescElement );
92 
93  //defining coverage name
94  QString coveNames;
95  //read COVERAGE
96  QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( QStringLiteral( "COVERAGE" ) );
97  if ( cove_name_it != parameters.constEnd() )
98  {
99  coveNames = cove_name_it.value();
100  }
101  if ( coveNames.isEmpty() )
102  {
103  QMap<QString, QString>::const_iterator cove_name_it = parameters.constFind( QStringLiteral( "IDENTIFIER" ) );
104  if ( cove_name_it != parameters.constEnd() )
105  {
106  coveNames = cove_name_it.value();
107  }
108  }
109 
110  QStringList coveNameList;
111  if ( !coveNames.isEmpty() )
112  {
113  coveNameList = coveNames.split( ',' );
114  for ( int i = 0; i < coveNameList.size(); ++i )
115  {
116  coveNameList.replace( i, coveNameList.at( i ).trimmed() );
117  }
118  }
119 
120  QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
121  for ( int i = 0; i < wcsLayersId.size(); ++i )
122  {
123  QgsMapLayer *layer = project->mapLayer( wcsLayersId.at( i ) );
124  if ( !layer )
125  {
126  continue;
127  }
128  if ( layer->type() != QgsMapLayerType::RasterLayer )
129  {
130  continue;
131  }
132 #ifdef HAVE_SERVER_PYTHON_PLUGINS
133  if ( !accessControl->layerReadPermission( layer ) )
134  {
135  continue;
136  }
137 #endif
138  QString name = layer->name();
139  if ( !layer->shortName().isEmpty() )
140  name = layer->shortName();
141  name = name.replace( ' ', '_' );
142 
143  if ( coveNameList.size() == 0 || coveNameList.contains( name ) )
144  {
145  QgsRasterLayer *rLayer = qobject_cast<QgsRasterLayer *>( layer );
146  coveDescElement.appendChild( getCoverageOffering( doc, const_cast<QgsRasterLayer *>( rLayer ), project ) );
147  }
148  }
149  return doc;
150  }
151 
152 } // namespace QgsWcs
153 
154 
155 
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...
Base class for all map layer types.
Definition: qgsmaplayer.h:79
QgsMapLayerType type() const
Returns the type of the layer.
const QString WCS_NAMESPACE
Definition: qgswcsutils.h:62
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
void writeDescribeCoverage(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WCS DescribeCoverage response.
QDomDocument createDescribeCoverageDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create describe coverage document.
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device...
const QString GML_NAMESPACE
Definition: qgswcsutils.h:63
QgsServerRequest::Parameters parameters() const
Returns a map of query parameters with keys converted to uppercase.
SERVER_EXPORT QStringList wcsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WCS.
A helper class that centralizes caches accesses given by all the server cache filter plugins...
Encapsulates a QGIS project, including sets of map layers and their styles, layouts, annotations, canvases, etc.
Definition: qgsproject.h:89
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.
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...
QDomElement getCoverageOffering(QDomDocument &doc, const QgsRasterLayer *layer, const QgsProject *project, bool brief)
CoverageOffering or CoverageOfferingBrief element.
Definition: qgswcsutils.cpp:35
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.
A helper class that centralizes restrictions given by all the access control filter plugins...
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
QString name
Definition: qgsmaplayer.h:83
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
WCS implementation.
Definition: qgswcs.cpp:29
QMap< QString, QString > Parameters