42#ifdef HAVE_SERVER_PYTHON_PLUGINS
46 const QDomDocument *capabilitiesDocument =
nullptr;
48#ifdef HAVE_SERVER_PYTHON_PLUGINS
50 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
52 capabilitiesDocument = &doc;
62 capabilitiesDocument = &doc;
66 capabilitiesDocument = &doc;
68 response.
setHeader( QStringLiteral(
"Content-Type" ), QStringLiteral(
"text/xml; charset=utf-8" ) );
69 response.
write( capabilitiesDocument->toByteArray() );
81 QDomElement wfsCapabilitiesElement = doc.createElement( QStringLiteral(
"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 );
106 QDomElement filterCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Filter_Capabilities" ) );
107 wfsCapabilitiesElement.appendChild( filterCapabilitiesElement );
108 QDomElement spatialCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Spatial_Capabilities" ) );
109 filterCapabilitiesElement.appendChild( spatialCapabilitiesElement );
110 QDomElement spatialOperatorsElement = doc.createElement( QStringLiteral(
"ogc:Spatial_Operators" ) );
111 spatialCapabilitiesElement.appendChild( spatialOperatorsElement );
112 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:BBOX" ) ) );
113 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Disjoint" ) ) );
114 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Intersect" ) ) );
115 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Touches" ) ) );
116 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Crosses" ) ) );
117 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Contains" ) ) );
118 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Overlaps" ) ) );
119 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Within" ) ) );
120 QDomElement scalarCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Scalar_Capabilities" ) );
121 filterCapabilitiesElement.appendChild( scalarCapabilitiesElement );
122 QDomElement comparisonOperatorsElement = doc.createElement( QStringLiteral(
"ogc:Comparison_Operators" ) );
123 scalarCapabilitiesElement.appendChild( comparisonOperatorsElement );
124 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Simple_Comparisons" ) ) );
125 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Between" ) ) );
126 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Like" ) ) );
135 QDomElement serviceElem = doc.createElement( QStringLiteral(
"Service" ) );
138 QDomElement nameElem = doc.createElement( QStringLiteral(
"Name" ) );
139 const QDomText nameText = doc.createTextNode(
"WFS" );
140 nameElem.appendChild( nameText );
141 serviceElem.appendChild( nameElem );
144 QDomElement titleElem = doc.createElement( QStringLiteral(
"Title" ) );
145 const QDomText titleText = doc.createTextNode( title );
146 titleElem.appendChild( titleText );
147 serviceElem.appendChild( titleElem );
150 if ( !abstract.isEmpty() )
152 QDomElement abstractElem = doc.createElement( QStringLiteral(
"Abstract" ) );
153 const QDomText abstractText = doc.createCDATASection( abstract );
154 abstractElem.appendChild( abstractText );
155 serviceElem.appendChild( abstractElem );
159 if ( !keywords.isEmpty() && !keywords.join( QLatin1String(
", " ) ).isEmpty() )
161 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"Keywords" ) );
162 const QDomText keywordsText = doc.createTextNode( keywords.join( QLatin1String(
", " ) ) );
163 keywordsElem.appendChild( keywordsText );
164 serviceElem.appendChild( keywordsElem );
167 QDomElement onlineResourceElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
169 if ( !onlineResource.isEmpty() )
171 const QDomText onlineResourceText = doc.createTextNode( onlineResource );
172 onlineResourceElem.appendChild( onlineResourceText );
174 serviceElem.appendChild( onlineResourceElem );
177 if ( !fees.isEmpty() )
179 QDomElement feesElem = doc.createElement( QStringLiteral(
"Fees" ) );
180 const QDomText feesText = doc.createTextNode( fees );
181 feesElem.appendChild( feesText );
182 serviceElem.appendChild( feesElem );
186 if ( !accessConstraints.isEmpty() )
188 QDomElement accessConstraintsElem = doc.createElement( QStringLiteral(
"AccessConstraints" ) );
189 const QDomText accessConstraintsText = doc.createTextNode( accessConstraints );
190 accessConstraintsElem.appendChild( accessConstraintsText );
191 serviceElem.appendChild( accessConstraintsElem );
201 QDomElement capabilityElement = doc.createElement( QStringLiteral(
"Capability" ) );
204 QDomElement requestElement = doc.createElement( QStringLiteral(
"Request" ) );
205 capabilityElement.appendChild( requestElement );
207 QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral(
"GetCapabilities" ) );
208 requestElement.appendChild( getCapabilitiesElement );
210 QDomElement dcpTypeElement = doc.createElement( QStringLiteral(
"DCPType" ) );
211 getCapabilitiesElement.appendChild( dcpTypeElement );
212 QDomElement httpElement = doc.createElement( QStringLiteral(
"HTTP" ) );
213 dcpTypeElement.appendChild( httpElement );
216 const QString hrefString =
serviceUrl( request, project, *settings );
219 QDomElement getElement = doc.createElement( QStringLiteral(
"Get" ) );
220 httpElement.appendChild( getElement );
221 getElement.setAttribute( QStringLiteral(
"onlineResource" ), hrefString );
222 const QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
223 getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
224 getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement );
227 QDomElement describeFeatureTypeElement = doc.createElement( QStringLiteral(
"DescribeFeatureType" ) );
228 requestElement.appendChild( describeFeatureTypeElement );
229 QDomElement schemaDescriptionLanguageElement = doc.createElement( QStringLiteral(
"SchemaDescriptionLanguage" ) );
230 describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement );
231 const QDomElement xmlSchemaElement = doc.createElement( QStringLiteral(
"XMLSCHEMA" ) );
232 schemaDescriptionLanguageElement.appendChild( xmlSchemaElement );
233 const QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();
234 describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement );
235 const QDomElement describeFeatureTypeDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
236 describeFeatureTypeDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
237 describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypePostElement );
240 QDomElement getFeatureElement = doc.createElement( QStringLiteral(
"GetFeature" ) );
241 requestElement.appendChild( getFeatureElement );
242 QDomElement getFeatureFormatElement = doc.createElement( QStringLiteral(
"ResultFormat" ) );
243 getFeatureElement.appendChild( getFeatureFormatElement );
244 const QDomElement gmlFormatElement = doc.createElement( QStringLiteral(
"GML2" ) );
245 getFeatureFormatElement.appendChild( gmlFormatElement );
246 const QDomElement gml3FormatElement = doc.createElement( QStringLiteral(
"GML3" ) );
247 getFeatureFormatElement.appendChild( gml3FormatElement );
248 const QDomElement geojsonFormatElement = doc.createElement( QStringLiteral(
"GeoJSON" ) );
249 getFeatureFormatElement.appendChild( geojsonFormatElement );
250 const QDomElement getFeatureDhcTypeGetElement = dcpTypeElement.cloneNode().toElement();
251 getFeatureElement.appendChild( getFeatureDhcTypeGetElement );
252 const QDomElement getFeatureDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
253 getFeatureDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
254 getFeatureElement.appendChild( getFeatureDhcTypePostElement );
257 QDomElement transactionElement = doc.createElement( QStringLiteral(
"Transaction" ) );
258 requestElement.appendChild( transactionElement );
259 const QDomElement transactionDhcTypeElement = dcpTypeElement.cloneNode().toElement();
260 transactionDhcTypeElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
261 transactionElement.appendChild( transactionDhcTypeElement );
263 return capabilityElement;
268#ifdef HAVE_SERVER_PYTHON_PLUGINS
275 QDomElement featureTypeListElement = doc.createElement( QStringLiteral(
"FeatureTypeList" ) );
277 QDomElement operationsElement = doc.createElement( QStringLiteral(
"Operations" ) );
278 featureTypeListElement.appendChild( operationsElement );
280 const QDomElement queryElement = doc.createElement( QStringLiteral(
"Query" ) );
281 operationsElement.appendChild( queryElement );
287 for (
const QString &wfsLayerId : wfsLayerIds )
298#ifdef HAVE_SERVER_PYTHON_PLUGINS
304 QDomElement layerElem = doc.createElement( QStringLiteral(
"FeatureType" ) );
307 QDomElement nameElem = doc.createElement( QStringLiteral(
"Name" ) );
312 const QDomText nameText = doc.createTextNode(
typeName );
313 nameElem.appendChild( nameText );
314 layerElem.appendChild( nameElem );
317 QDomElement titleElem = doc.createElement( QStringLiteral(
"Title" ) );
319 if ( title.isEmpty() )
321 title = layer->
name();
323 const QDomText titleText = doc.createTextNode( title );
324 titleElem.appendChild( titleText );
325 layerElem.appendChild( titleElem );
329 if ( !abstract.isEmpty() )
331 QDomElement abstractElem = doc.createElement( QStringLiteral(
"Abstract" ) );
332 const QDomText abstractText = doc.createTextNode( abstract );
333 abstractElem.appendChild( abstractText );
334 layerElem.appendChild( abstractElem );
339 if ( !keywords.isEmpty() )
341 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"Keywords" ) );
342 const QDomText keywordsText = doc.createTextNode( keywords );
343 keywordsElem.appendChild( keywordsText );
344 layerElem.appendChild( keywordsElem );
348 QDomElement srsElem = doc.createElement( QStringLiteral(
"SRS" ) );
349 const QDomText srsText = doc.createTextNode( layer->
crs().
authid() );
350 srsElem.appendChild( srsText );
351 layerElem.appendChild( srsElem );
362 QDomElement bBoxElement = doc.createElement( QStringLiteral(
"LatLongBoundingBox" ) );
367 layerElem.appendChild( bBoxElement );
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" ) )
379 metaUrlElem.setAttribute( QStringLiteral(
"format" ), QStringLiteral(
"XML" ) );
383 metaUrlElem.setAttribute( QStringLiteral(
"format" ), QStringLiteral(
"TXT" ) );
385 const QDomText metaUrlText = doc.createTextNode( url.url );
386 metaUrlElem.appendChild( metaUrlText );
387 layerElem.appendChild( metaUrlElem );
391 QDomElement operationsElement = doc.createElement( QStringLiteral(
"Operations" ) );
393 const QDomElement queryElement = doc.createElement( QStringLiteral(
"Query" ) );
394 operationsElement.appendChild( queryElement );
395 if ( wfstUpdateLayersId.contains( layer->
id() ) ||
396 wfstInsertLayersId.contains( layer->
id() ) ||
397 wfstDeleteLayersId.contains( layer->
id() ) )
404 const QDomElement insertElement = doc.createElement( QStringLiteral(
"Insert" ) );
405 operationsElement.appendChild( insertElement );
409 wfstUpdateLayersId.contains( layer->
id() ) )
412 const QDomElement updateElement = doc.createElement( QStringLiteral(
"Update" ) );
413 operationsElement.appendChild( updateElement );
418 const QDomElement deleteElement = doc.createElement( QStringLiteral(
"Delete" ) );
419 operationsElement.appendChild( deleteElement );
423 layerElem.appendChild( operationsElement );
425 featureTypeListElement.appendChild( layerElem );
428 return featureTypeListElement;
@ AddFeatures
Allows adding features.
@ ChangeGeometries
Allows modifications of geometries.
@ DeleteFeatures
Allows deletion of features.
@ ChangeAttributeValues
Allows modification of attribute values.
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 title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
QString keywordList() const
Returns the keyword list of the layerused by QGIS Server in GetCapabilities request.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QString abstract() const
Returns the abstract of the layerused by QGIS Server in GetCapabilities request.
Base class for all map layer types.
virtual QgsRectangle extent() const
Returns the extent of the layer.
QgsCoordinateReferenceSystem crs
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
A rectangle specified with double values.
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.
virtual QgsServerSettings * serverSettings()=0
Returns the server settings.
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.
virtual Q_INVOKABLE Qgis::VectorProviderCapabilities 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.
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.
QString serviceUrl(const QgsServerRequest &request, const QgsProject *project, const QgsServerSettings &settings)
Service URL string.
const QString OGC_NAMESPACE
const QString GML_NAMESPACE
const QString WFS_NAMESPACE
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.