QGIS API Documentation  3.24.2-Tisler (13c1a02865)
qgswfsgetcapabilities_1_0_0.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgswfsgecapabilities_1_0_0.cpp
3  -------------------------
4  begin : December 20 , 2016
5  copyright : (C) 2007 by Marco Hugentobler (original code)
6  (C) 2012 by RenĂ©-Luc D'Hont (original code)
7  (C) 2014 by Alessandro Pasotti (original code)
8  (C) 2017 by David Marteau
9  email : marco dot hugentobler at karto dot baug dot ethz dot ch
10  a dot pasotti at itopen dot it
11  david dot marteau at 3liz dot com
12  ***************************************************************************/
13 
14 /***************************************************************************
15  * *
16  * This program is free software; you can redistribute it and/or modify *
17  * it under the terms of the GNU General Public License as published by *
18  * the Free Software Foundation; either version 2 of the License, or *
19  * (at your option) any later version. *
20  * *
21  ***************************************************************************/
22 #include "qgswfsutils.h"
23 #include "qgsserverprojectutils.h"
25 
26 #include "qgsproject.h"
27 #include "qgsvectorlayer.h"
28 #include "qgsvectordataprovider.h"
30 
31 namespace QgsWfs
32 {
33  namespace v1_0_0
34  {
35 
39  void writeGetCapabilities( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
40  const QgsServerRequest &request, QgsServerResponse &response )
41  {
42 #ifdef HAVE_SERVER_PYTHON_PLUGINS
43  QgsAccessControl *accessControl = serverIface->accessControls();
44 #endif
45  QDomDocument doc;
46  const QDomDocument *capabilitiesDocument = nullptr;
47 
48 #ifdef HAVE_SERVER_PYTHON_PLUGINS
49  QgsServerCacheManager *cacheManager = serverIface->cacheManager();
50  if ( cacheManager && cacheManager->getCachedDocument( &doc, project, request, accessControl ) )
51  {
52  capabilitiesDocument = &doc;
53  }
54  else //capabilities xml not in cache. Create a new one
55  {
56  doc = createGetCapabilitiesDocument( serverIface, project, version, request );
57 
58  if ( cacheManager )
59  {
60  cacheManager->setCachedDocument( &doc, project, request, accessControl );
61  }
62  capabilitiesDocument = &doc;
63  }
64 #else
65  doc = createGetCapabilitiesDocument( serverIface, project, version, request );
66  capabilitiesDocument = &doc;
67 #endif
68  response.setHeader( QStringLiteral( "Content-Type" ), QStringLiteral( "text/xml; charset=utf-8" ) );
69  response.write( capabilitiesDocument->toByteArray() );
70  }
71 
72 
73  QDomDocument createGetCapabilitiesDocument( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
74  const QgsServerRequest &request )
75  {
76  Q_UNUSED( version )
77 
78  QDomDocument doc;
79 
80  //wfs:WFS_Capabilities element
81  QDomElement wfsCapabilitiesElement = doc.createElement( QStringLiteral( "WFS_Capabilities" )/*wms:WFS_Capabilities*/ );
82  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns" ), WFS_NAMESPACE );
83  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
84  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xsi:schemaLocation" ), WFS_NAMESPACE + " http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" );
85  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:ogc" ), OGC_NAMESPACE );
86  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:gml" ), GML_NAMESPACE );
87  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:ows" ), QStringLiteral( "http://www.opengis.net/ows" ) );
88  wfsCapabilitiesElement.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
89  wfsCapabilitiesElement.setAttribute( QStringLiteral( "version" ), QStringLiteral( "1.0.0" ) );
90  wfsCapabilitiesElement.setAttribute( QStringLiteral( "updateSequence" ), QStringLiteral( "0" ) );
91  doc.appendChild( wfsCapabilitiesElement );
92 
93  //wfs:Service
94  wfsCapabilitiesElement.appendChild( getServiceElement( doc, project ) );
95 
96  //wfs:Capability
97  wfsCapabilitiesElement.appendChild( getCapabilityElement( doc, project, request, serverIface->serverSettings() ) );
98 
99  //wfs:FeatureTypeList
100  wfsCapabilitiesElement.appendChild( getFeatureTypeListElement( doc, serverIface, project ) );
101 
102  /*
103  * Adding ogc:Filter_Capabilities in wfsCapabilitiesElement
104  */
105  //ogc:Filter_Capabilities element
106  QDomElement filterCapabilitiesElement = doc.createElement( QStringLiteral( "ogc:Filter_Capabilities" )/*ogc:Filter_Capabilities*/ );
107  wfsCapabilitiesElement.appendChild( filterCapabilitiesElement );
108  QDomElement spatialCapabilitiesElement = doc.createElement( QStringLiteral( "ogc:Spatial_Capabilities" )/*ogc:Spatial_Capabilities*/ );
109  filterCapabilitiesElement.appendChild( spatialCapabilitiesElement );
110  QDomElement spatialOperatorsElement = doc.createElement( QStringLiteral( "ogc:Spatial_Operators" )/*ogc:Spatial_Operators*/ );
111  spatialCapabilitiesElement.appendChild( spatialOperatorsElement );
112  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:BBOX" )/*ogc:BBOX*/ ) );
113  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Disjoint" )/*ogc:Disjoint*/ ) );
114  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Intersect" )/*ogc:Intersects*/ ) );
115  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Touches" )/*ogc:Touches*/ ) );
116  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Crosses" )/*ogc:Crosses*/ ) );
117  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Contains" )/*ogc:Contains*/ ) );
118  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Overlaps" )/*ogc:Overlaps*/ ) );
119  spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Within" )/*ogc:Within*/ ) );
120  QDomElement scalarCapabilitiesElement = doc.createElement( QStringLiteral( "ogc:Scalar_Capabilities" )/*ogc:Scalar_Capabilities*/ );
121  filterCapabilitiesElement.appendChild( scalarCapabilitiesElement );
122  QDomElement comparisonOperatorsElement = doc.createElement( QStringLiteral( "ogc:Comparison_Operators" )/*ogc:Comparison_Operators*/ );
123  scalarCapabilitiesElement.appendChild( comparisonOperatorsElement );
124  comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Simple_Comparisons" )/*ogc:Simple_Comparisons*/ ) );
125  comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Between" )/*ogc:Between*/ ) );
126  comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral( "ogc:Like" )/*ogc:Like*/ ) );
127 
128  return doc;
129 
130  }
131 
132  QDomElement getServiceElement( QDomDocument &doc, const QgsProject *project )
133  {
134  //Service element
135  QDomElement serviceElem = doc.createElement( QStringLiteral( "Service" ) );
136 
137  //Service name
138  QDomElement nameElem = doc.createElement( QStringLiteral( "Name" ) );
139  const QDomText nameText = doc.createTextNode( "WFS" );
140  nameElem.appendChild( nameText );
141  serviceElem.appendChild( nameElem );
142 
143  const QString title = QgsServerProjectUtils::owsServiceTitle( *project );
144  QDomElement titleElem = doc.createElement( QStringLiteral( "Title" ) );
145  const QDomText titleText = doc.createTextNode( title );
146  titleElem.appendChild( titleText );
147  serviceElem.appendChild( titleElem );
148 
149  const QString abstract = QgsServerProjectUtils::owsServiceAbstract( *project );
150  if ( !abstract.isEmpty() )
151  {
152  QDomElement abstractElem = doc.createElement( QStringLiteral( "Abstract" ) );
153  const QDomText abstractText = doc.createCDATASection( abstract );
154  abstractElem.appendChild( abstractText );
155  serviceElem.appendChild( abstractElem );
156  }
157 
158  const QStringList keywords = QgsServerProjectUtils::owsServiceKeywords( *project );
159  if ( !keywords.isEmpty() && !keywords.join( QLatin1String( ", " ) ).isEmpty() )
160  {
161  QDomElement keywordsElem = doc.createElement( QStringLiteral( "Keywords" ) );
162  const QDomText keywordsText = doc.createTextNode( keywords.join( QLatin1String( ", " ) ) );
163  keywordsElem.appendChild( keywordsText );
164  serviceElem.appendChild( keywordsElem );
165  }
166 
167  QDomElement onlineResourceElem = doc.createElement( QStringLiteral( "OnlineResource" ) );
168  const QString onlineResource = QgsServerProjectUtils::owsServiceOnlineResource( *project );
169  if ( !onlineResource.isEmpty() )
170  {
171  const QDomText onlineResourceText = doc.createTextNode( onlineResource );
172  onlineResourceElem.appendChild( onlineResourceText );
173  }
174  serviceElem.appendChild( onlineResourceElem );
175 
176  const QString fees = QgsServerProjectUtils::owsServiceFees( *project );
177  if ( !fees.isEmpty() )
178  {
179  QDomElement feesElem = doc.createElement( QStringLiteral( "Fees" ) );
180  const QDomText feesText = doc.createTextNode( fees );
181  feesElem.appendChild( feesText );
182  serviceElem.appendChild( feesElem );
183  }
184 
185  const QString accessConstraints = QgsServerProjectUtils::owsServiceAccessConstraints( *project );
186  if ( !accessConstraints.isEmpty() )
187  {
188  QDomElement accessConstraintsElem = doc.createElement( QStringLiteral( "AccessConstraints" ) );
189  const QDomText accessConstraintsText = doc.createTextNode( accessConstraints );
190  accessConstraintsElem.appendChild( accessConstraintsText );
191  serviceElem.appendChild( accessConstraintsElem );
192  }
193 
194  return serviceElem;
195 
196  }
197 
198  QDomElement getCapabilityElement( QDomDocument &doc, const QgsProject *project, const QgsServerRequest &request, const QgsServerSettings *settings )
199  {
200  //wfs:Capability element
201  QDomElement capabilityElement = doc.createElement( QStringLiteral( "Capability" )/*wfs:Capability*/ );
202 
203  //wfs:Request element
204  QDomElement requestElement = doc.createElement( QStringLiteral( "Request" )/*wfs:Request*/ );
205  capabilityElement.appendChild( requestElement );
206  //wfs:GetCapabilities
207  QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral( "GetCapabilities" )/*wfs:GetCapabilities*/ );
208  requestElement.appendChild( getCapabilitiesElement );
209 
210  QDomElement dcpTypeElement = doc.createElement( QStringLiteral( "DCPType" )/*wfs:DCPType*/ );
211  getCapabilitiesElement.appendChild( dcpTypeElement );
212  QDomElement httpElement = doc.createElement( QStringLiteral( "HTTP" )/*wfs:HTTP*/ );
213  dcpTypeElement.appendChild( httpElement );
214 
215  //Prepare url
216  const QString hrefString = serviceUrl( request, project, *settings );
217 
218  //only Get supported for the moment
219  QDomElement getElement = doc.createElement( QStringLiteral( "Get" )/*wfs:Get*/ );
220  httpElement.appendChild( getElement );
221  getElement.setAttribute( QStringLiteral( "onlineResource" ), hrefString );
222  const QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities'
223  getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) );
224  getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement );
225 
226  //wfs:DescribeFeatureType
227  QDomElement describeFeatureTypeElement = doc.createElement( QStringLiteral( "DescribeFeatureType" )/*wfs:DescribeFeatureType*/ );
228  requestElement.appendChild( describeFeatureTypeElement );
229  QDomElement schemaDescriptionLanguageElement = doc.createElement( QStringLiteral( "SchemaDescriptionLanguage" )/*wfs:SchemaDescriptionLanguage*/ );
230  describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement );
231  const QDomElement xmlSchemaElement = doc.createElement( QStringLiteral( "XMLSCHEMA" )/*wfs:XMLSCHEMA*/ );
232  schemaDescriptionLanguageElement.appendChild( xmlSchemaElement );
233  const QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities'
234  describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement );
235  const QDomElement describeFeatureTypeDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities'
236  describeFeatureTypeDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) );
237  describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypePostElement );
238 
239  //wfs:GetFeature
240  QDomElement getFeatureElement = doc.createElement( QStringLiteral( "GetFeature" )/*wfs:GetFeature*/ );
241  requestElement.appendChild( getFeatureElement );
242  QDomElement getFeatureFormatElement = doc.createElement( QStringLiteral( "ResultFormat" ) );/*wfs:ResultFormat*/
243  getFeatureElement.appendChild( getFeatureFormatElement );
244  const QDomElement gmlFormatElement = doc.createElement( QStringLiteral( "GML2" ) );/*wfs:GML2*/
245  getFeatureFormatElement.appendChild( gmlFormatElement );
246  const QDomElement gml3FormatElement = doc.createElement( QStringLiteral( "GML3" ) );/*wfs:GML3*/
247  getFeatureFormatElement.appendChild( gml3FormatElement );
248  const QDomElement geojsonFormatElement = doc.createElement( QStringLiteral( "GeoJSON" ) );/*wfs:GeoJSON*/
249  getFeatureFormatElement.appendChild( geojsonFormatElement );
250  const QDomElement getFeatureDhcTypeGetElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities'
251  getFeatureElement.appendChild( getFeatureDhcTypeGetElement );
252  const QDomElement getFeatureDhcTypePostElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities'
253  getFeatureDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) );
254  getFeatureElement.appendChild( getFeatureDhcTypePostElement );
255 
256  //wfs:Transaction
257  QDomElement transactionElement = doc.createElement( QStringLiteral( "Transaction" )/*wfs:Transaction*/ );
258  requestElement.appendChild( transactionElement );
259  const QDomElement transactionDhcTypeElement = dcpTypeElement.cloneNode().toElement();//this is the same as for 'GetCapabilities'
260  transactionDhcTypeElement.firstChild().firstChild().toElement().setTagName( QStringLiteral( "Post" ) );
261  transactionElement.appendChild( transactionDhcTypeElement );
262 
263  return capabilityElement;
264  }
265 
266  QDomElement getFeatureTypeListElement( QDomDocument &doc, QgsServerInterface *serverIface, const QgsProject *project )
267  {
268 #ifdef HAVE_SERVER_PYTHON_PLUGINS
269  QgsAccessControl *accessControl = serverIface->accessControls();
270 #else
271  ( void )serverIface;
272 #endif
273 
274  //wfs:FeatureTypeList element
275  QDomElement featureTypeListElement = doc.createElement( QStringLiteral( "FeatureTypeList" )/*wfs:FeatureTypeList*/ );
276  //wfs:Operations element
277  QDomElement operationsElement = doc.createElement( QStringLiteral( "Operations" )/*wfs:Operations*/ );
278  featureTypeListElement.appendChild( operationsElement );
279  //wfs:Query element
280  const QDomElement queryElement = doc.createElement( QStringLiteral( "Query" )/*wfs:Query*/ );
281  operationsElement.appendChild( queryElement );
282 
283  const QStringList wfsLayerIds = QgsServerProjectUtils::wfsLayerIds( *project );
284  const QStringList wfstUpdateLayersId = QgsServerProjectUtils::wfstUpdateLayerIds( *project );
285  const QStringList wfstInsertLayersId = QgsServerProjectUtils::wfstInsertLayerIds( *project );
286  const QStringList wfstDeleteLayersId = QgsServerProjectUtils::wfstDeleteLayerIds( *project );
287  for ( const QString &wfsLayerId : wfsLayerIds )
288  {
289  QgsMapLayer *layer = project->mapLayer( wfsLayerId );
290  if ( !layer )
291  {
292  continue;
293  }
294  if ( layer->type() != QgsMapLayerType::VectorLayer )
295  {
296  continue;
297  }
298 #ifdef HAVE_SERVER_PYTHON_PLUGINS
299  if ( accessControl && !accessControl->layerReadPermission( layer ) )
300  {
301  continue;
302  }
303 #endif
304  QDomElement layerElem = doc.createElement( QStringLiteral( "FeatureType" ) );
305 
306  //create Name
307  QDomElement nameElem = doc.createElement( QStringLiteral( "Name" ) );
308  QString typeName = layer->name();
309  if ( !layer->shortName().isEmpty() )
310  typeName = layer->shortName();
311  typeName = typeName.replace( QLatin1String( " " ), QLatin1String( "_" ) );
312  const QDomText nameText = doc.createTextNode( typeName );
313  nameElem.appendChild( nameText );
314  layerElem.appendChild( nameElem );
315 
316  //create Title
317  QDomElement titleElem = doc.createElement( QStringLiteral( "Title" ) );
318  QString title = layer->title();
319  if ( title.isEmpty() )
320  {
321  title = layer->name();
322  }
323  const QDomText titleText = doc.createTextNode( title );
324  titleElem.appendChild( titleText );
325  layerElem.appendChild( titleElem );
326 
327  //create Abstract
328  const QString abstract = layer->abstract();
329  if ( !abstract.isEmpty() )
330  {
331  QDomElement abstractElem = doc.createElement( QStringLiteral( "Abstract" ) );
332  const QDomText abstractText = doc.createTextNode( abstract );
333  abstractElem.appendChild( abstractText );
334  layerElem.appendChild( abstractElem );
335  }
336 
337  //create keywords
338  const QString keywords = layer->keywordList();
339  if ( !keywords.isEmpty() )
340  {
341  QDomElement keywordsElem = doc.createElement( QStringLiteral( "Keywords" ) );
342  const QDomText keywordsText = doc.createTextNode( keywords );
343  keywordsElem.appendChild( keywordsText );
344  layerElem.appendChild( keywordsElem );
345  }
346 
347  //create SRS
348  QDomElement srsElem = doc.createElement( QStringLiteral( "SRS" ) );
349  const QDomText srsText = doc.createTextNode( layer->crs().authid() );
350  srsElem.appendChild( srsText );
351  layerElem.appendChild( srsElem );
352 
353  // Define precision
354  int precision = 3;
355  if ( layer->crs().isGeographic() )
356  {
357  precision = 6;
358  }
359 
360  //create LatLongBoundingBox
361  const QgsRectangle layerExtent = layer->extent();
362  QDomElement bBoxElement = doc.createElement( QStringLiteral( "LatLongBoundingBox" ) );
363  bBoxElement.setAttribute( QStringLiteral( "minx" ), qgsDoubleToString( QgsServerProjectUtils::floorWithPrecision( layerExtent.xMinimum(), precision ), precision ) );
364  bBoxElement.setAttribute( QStringLiteral( "miny" ), qgsDoubleToString( QgsServerProjectUtils::floorWithPrecision( layerExtent.yMinimum(), precision ), precision ) );
365  bBoxElement.setAttribute( QStringLiteral( "maxx" ), qgsDoubleToString( QgsServerProjectUtils::ceilWithPrecision( layerExtent.xMaximum(), precision ), precision ) );
366  bBoxElement.setAttribute( QStringLiteral( "maxy" ), qgsDoubleToString( QgsServerProjectUtils::ceilWithPrecision( layerExtent.yMaximum(), precision ), precision ) );
367  layerElem.appendChild( bBoxElement );
368 
369  // layer metadata URL
370  const QList<QgsMapLayerServerProperties::MetadataUrl> urls = layer->serverProperties()->metadataUrls();
371  for ( const QgsMapLayerServerProperties::MetadataUrl &url : urls )
372  {
373  QDomElement metaUrlElem = doc.createElement( QStringLiteral( "MetadataURL" ) );
374  const QString metadataUrlType = url.type;
375  metaUrlElem.setAttribute( QStringLiteral( "type" ), metadataUrlType );
376  const QString metadataUrlFormat = url.format;
377  if ( metadataUrlFormat == QLatin1String( "text/xml" ) )
378  {
379  metaUrlElem.setAttribute( QStringLiteral( "format" ), QStringLiteral( "XML" ) );
380  }
381  else
382  {
383  metaUrlElem.setAttribute( QStringLiteral( "format" ), QStringLiteral( "TXT" ) );
384  }
385  const QDomText metaUrlText = doc.createTextNode( url.url );
386  metaUrlElem.appendChild( metaUrlText );
387  layerElem.appendChild( metaUrlElem );
388  }
389 
390  //wfs:Operations element
391  QDomElement operationsElement = doc.createElement( QStringLiteral( "Operations" )/*wfs:Operations*/ );
392  //wfs:Query element
393  const QDomElement queryElement = doc.createElement( QStringLiteral( "Query" )/*wfs:Query*/ );
394  operationsElement.appendChild( queryElement );
395  if ( wfstUpdateLayersId.contains( layer->id() ) ||
396  wfstInsertLayersId.contains( layer->id() ) ||
397  wfstDeleteLayersId.contains( layer->id() ) )
398  {
399  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
400  QgsVectorDataProvider *provider = vlayer->dataProvider();
401  if ( ( provider->capabilities() & QgsVectorDataProvider::AddFeatures ) && wfstInsertLayersId.contains( layer->id() ) )
402  {
403  //wfs:Insert element
404  const QDomElement insertElement = doc.createElement( QStringLiteral( "Insert" )/*wfs:Insert*/ );
405  operationsElement.appendChild( insertElement );
406  }
409  wfstUpdateLayersId.contains( layer->id() ) )
410  {
411  //wfs:Update element
412  const QDomElement updateElement = doc.createElement( QStringLiteral( "Update" )/*wfs:Update*/ );
413  operationsElement.appendChild( updateElement );
414  }
415  if ( ( provider->capabilities() & QgsVectorDataProvider::DeleteFeatures ) && wfstDeleteLayersId.contains( layer->id() ) )
416  {
417  //wfs:Delete element
418  const QDomElement deleteElement = doc.createElement( QStringLiteral( "Delete" )/*wfs:Delete*/ );
419  operationsElement.appendChild( deleteElement );
420  }
421  }
422 
423  layerElem.appendChild( operationsElement );
424 
425  featureTypeListElement.appendChild( layerElem );
426  }
427 
428  return featureTypeListElement;
429  }
430 
431  } // namespace v1_0_0
432 } // namespace QgsWfs
433 
434 
435 
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.
Base class for all map layer types.
Definition: qgsmaplayer.h:73
QString name
Definition: qgsmaplayer.h:76
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsMapLayerType type
Definition: qgsmaplayer.h:80
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:79
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString abstract() const
Returns the abstract of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:326
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
Definition: qgsmaplayer.h:426
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:310
QString keywordList() const
Returns the keyword list of the layer used by QGIS Server in GetCapabilities request.
Definition: qgsmaplayer.h:342
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition: qgsproject.h:101
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:193
double xMaximum() const SIP_HOLDGIL
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:183
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:188
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:198
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 QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
virtual QgsServerCacheManager * cacheManager() const =0
Gets the registered server cache filters.
virtual QgsServerSettings * serverSettings()=0
Returns the server settings.
QList< QgsServerMetadataUrlProperties::MetadataUrl > metadataUrls() const
Returns a list of metadataUrl resources associated for the layer.
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
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...
Provides a way to retrieve settings by prioritizing according to environment variables,...
This is the base class for vector data providers.
@ ChangeGeometries
Allows modifications of geometries.
@ DeleteFeatures
Allows deletion of features.
@ ChangeAttributeValues
Allows modification of attribute values.
@ AddFeatures
Allows adding features.
virtual Q_INVOKABLE QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
Represents a vector layer which manages a vector based data sets.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
@ VectorLayer
Vector layer.
SERVER_EXPORT double ceilWithPrecision(double number, int places)
Returns a double greater than number to the specified number of places.
SERVER_EXPORT QString owsServiceAccessConstraints(const QgsProject &project)
Returns the owsService access constraints defined in project.
SERVER_EXPORT QStringList wfsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WFS.
SERVER_EXPORT QString owsServiceOnlineResource(const QgsProject &project)
Returns the owsService online resource defined in project.
SERVER_EXPORT QString owsServiceFees(const QgsProject &project)
Returns the owsService fees defined in project.
SERVER_EXPORT QStringList owsServiceKeywords(const QgsProject &project)
Returns the owsService keywords defined in project.
SERVER_EXPORT QStringList wfstUpdateLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published as WFS-T with update capabilities.
SERVER_EXPORT QStringList wfstInsertLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published as WFS-T with insert capabilities.
SERVER_EXPORT QString owsServiceTitle(const QgsProject &project)
Returns the owsService title defined in project.
SERVER_EXPORT QString owsServiceAbstract(const QgsProject &project)
Returns the owsService abstract defined in project.
SERVER_EXPORT double floorWithPrecision(double number, int places)
Returns a double less than number to the specified number of places.
SERVER_EXPORT QStringList wfstDeleteLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published as WFS-T with delete capabilities.
void writeGetCapabilities(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WFS GetCapabilities response.
QDomElement getFeatureTypeListElement(QDomDocument &doc, QgsServerInterface *serverIface, const QgsProject *project)
Create FeatureTypeList element for get capabilities document.
QDomDocument createGetCapabilitiesDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create get capabilities document.
QDomElement getCapabilityElement(QDomDocument &doc, const QgsProject *project, const QgsServerRequest &request, const QgsServerSettings *settings)
Create Capability element for get capabilities document.
QDomElement getServiceElement(QDomDocument &doc, const QgsProject *project)
Create Service element for get capabilities document.
WMS implementation.
Definition: qgswfs.cpp:36
QString serviceUrl(const QgsServerRequest &request, const QgsProject *project, const QgsServerSettings &settings)
Service URL string.
Definition: qgswfsutils.cpp:37
const QString OGC_NAMESPACE
Definition: qgswfsutils.h:74
const QString GML_NAMESPACE
Definition: qgswfsutils.h:73
const QString WFS_NAMESPACE
Definition: qgswfsutils.h:72
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition: qgis.h:1530
const QString & typeName
int precision