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;
67 response.
setHeader( QStringLiteral(
"Content-Type" ), QStringLiteral(
"text/xml; charset=utf-8" ) );
68 response.
write( capabilitiesDocument->toByteArray() );
80 QDomElement wfsCapabilitiesElement = doc.createElement( QStringLiteral(
"WFS_Capabilities" ) );
81 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns" ),
WFS_NAMESPACE );
82 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:xsi" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema-instance" ) );
83 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xsi:schemaLocation" ),
WFS_NAMESPACE +
" http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd" );
84 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:ogc" ),
OGC_NAMESPACE );
85 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:gml" ),
GML_NAMESPACE );
86 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:ows" ), QStringLiteral(
"http://www.opengis.net/ows" ) );
87 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"xmlns:xlink" ), QStringLiteral(
"http://www.w3.org/1999/xlink" ) );
88 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.0.0" ) );
89 wfsCapabilitiesElement.setAttribute( QStringLiteral(
"updateSequence" ), QStringLiteral(
"0" ) );
90 doc.appendChild( wfsCapabilitiesElement );
105 QDomElement filterCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Filter_Capabilities" ) );
106 wfsCapabilitiesElement.appendChild( filterCapabilitiesElement );
107 QDomElement spatialCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Spatial_Capabilities" ) );
108 filterCapabilitiesElement.appendChild( spatialCapabilitiesElement );
109 QDomElement spatialOperatorsElement = doc.createElement( QStringLiteral(
"ogc:Spatial_Operators" ) );
110 spatialCapabilitiesElement.appendChild( spatialOperatorsElement );
111 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:BBOX" ) ) );
112 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Disjoint" ) ) );
113 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Intersect" ) ) );
114 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Touches" ) ) );
115 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Crosses" ) ) );
116 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Contains" ) ) );
117 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Overlaps" ) ) );
118 spatialOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Within" ) ) );
119 QDomElement scalarCapabilitiesElement = doc.createElement( QStringLiteral(
"ogc:Scalar_Capabilities" ) );
120 filterCapabilitiesElement.appendChild( scalarCapabilitiesElement );
121 QDomElement comparisonOperatorsElement = doc.createElement( QStringLiteral(
"ogc:Comparison_Operators" ) );
122 scalarCapabilitiesElement.appendChild( comparisonOperatorsElement );
123 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Simple_Comparisons" ) ) );
124 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Between" ) ) );
125 comparisonOperatorsElement.appendChild( doc.createElement( QStringLiteral(
"ogc:Like" ) ) );
134 QDomElement serviceElem = doc.createElement( QStringLiteral(
"Service" ) );
137 QDomElement nameElem = doc.createElement( QStringLiteral(
"Name" ) );
138 QDomText nameText = doc.createTextNode(
"WFS" );
139 nameElem.appendChild( nameText );
140 serviceElem.appendChild( nameElem );
143 if ( !title.isEmpty() )
145 QDomElement titleElem = doc.createElement( QStringLiteral(
"Title" ) );
146 QDomText titleText = doc.createTextNode( title );
147 titleElem.appendChild( titleText );
148 serviceElem.appendChild( titleElem );
152 if ( !
abstract.isEmpty() )
154 QDomElement abstractElem = doc.createElement( QStringLiteral(
"Abstract" ) );
155 QDomText abstractText = doc.createCDATASection(
abstract );
156 abstractElem.appendChild( abstractText );
157 serviceElem.appendChild( abstractElem );
161 if ( !keywords.isEmpty() && !keywords.join( QStringLiteral(
", " ) ).isEmpty() )
163 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"Keywords" ) );
164 QDomText keywordsText = doc.createTextNode( keywords.join( QStringLiteral(
", " ) ) );
165 keywordsElem.appendChild( keywordsText );
166 serviceElem.appendChild( keywordsElem );
169 QDomElement onlineResourceElem = doc.createElement( QStringLiteral(
"OnlineResource" ) );
171 if ( !onlineResource.isEmpty() )
173 QDomText onlineResourceText = doc.createTextNode( onlineResource );
174 onlineResourceElem.appendChild( onlineResourceText );
176 serviceElem.appendChild( onlineResourceElem );
179 if ( !fees.isEmpty() )
181 QDomElement feesElem = doc.createElement( QStringLiteral(
"Fees" ) );
182 QDomText feesText = doc.createTextNode( fees );
183 feesElem.appendChild( feesText );
184 serviceElem.appendChild( feesElem );
188 if ( !accessConstraints.isEmpty() )
190 QDomElement accessConstraintsElem = doc.createElement( QStringLiteral(
"AccessConstraints" ) );
191 QDomText accessConstraintsText = doc.createTextNode( accessConstraints );
192 accessConstraintsElem.appendChild( accessConstraintsText );
193 serviceElem.appendChild( accessConstraintsElem );
203 QDomElement capabilityElement = doc.createElement( QStringLiteral(
"Capability" ) );
206 QDomElement requestElement = doc.createElement( QStringLiteral(
"Request" ) );
207 capabilityElement.appendChild( requestElement );
209 QDomElement getCapabilitiesElement = doc.createElement( QStringLiteral(
"GetCapabilities" ) );
210 requestElement.appendChild( getCapabilitiesElement );
212 QDomElement dcpTypeElement = doc.createElement( QStringLiteral(
"DCPType" ) );
213 getCapabilitiesElement.appendChild( dcpTypeElement );
214 QDomElement httpElement = doc.createElement( QStringLiteral(
"HTTP" ) );
215 dcpTypeElement.appendChild( httpElement );
218 QString hrefString =
serviceUrl( request, project );
221 QDomElement getElement = doc.createElement( QStringLiteral(
"Get" ) );
222 httpElement.appendChild( getElement );
223 getElement.setAttribute( QStringLiteral(
"onlineResource" ), hrefString );
224 QDomElement getCapabilitiesDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
225 getCapabilitiesDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
226 getCapabilitiesElement.appendChild( getCapabilitiesDhcTypePostElement );
229 QDomElement describeFeatureTypeElement = doc.createElement( QStringLiteral(
"DescribeFeatureType" ) );
230 requestElement.appendChild( describeFeatureTypeElement );
231 QDomElement schemaDescriptionLanguageElement = doc.createElement( QStringLiteral(
"SchemaDescriptionLanguage" ) );
232 describeFeatureTypeElement.appendChild( schemaDescriptionLanguageElement );
233 QDomElement xmlSchemaElement = doc.createElement( QStringLiteral(
"XMLSCHEMA" ) );
234 schemaDescriptionLanguageElement.appendChild( xmlSchemaElement );
235 QDomElement describeFeatureTypeDhcTypeElement = dcpTypeElement.cloneNode().toElement();
236 describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypeElement );
237 QDomElement describeFeatureTypeDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
238 describeFeatureTypeDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
239 describeFeatureTypeElement.appendChild( describeFeatureTypeDhcTypePostElement );
242 QDomElement getFeatureElement = doc.createElement( QStringLiteral(
"GetFeature" ) );
243 requestElement.appendChild( getFeatureElement );
244 QDomElement getFeatureFormatElement = doc.createElement( QStringLiteral(
"ResultFormat" ) );
245 getFeatureElement.appendChild( getFeatureFormatElement );
246 QDomElement gmlFormatElement = doc.createElement( QStringLiteral(
"GML2" ) );
247 getFeatureFormatElement.appendChild( gmlFormatElement );
248 QDomElement gml3FormatElement = doc.createElement( QStringLiteral(
"GML3" ) );
249 getFeatureFormatElement.appendChild( gml3FormatElement );
250 QDomElement geojsonFormatElement = doc.createElement( QStringLiteral(
"GeoJSON" ) );
251 getFeatureFormatElement.appendChild( geojsonFormatElement );
252 QDomElement getFeatureDhcTypeGetElement = dcpTypeElement.cloneNode().toElement();
253 getFeatureElement.appendChild( getFeatureDhcTypeGetElement );
254 QDomElement getFeatureDhcTypePostElement = dcpTypeElement.cloneNode().toElement();
255 getFeatureDhcTypePostElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
256 getFeatureElement.appendChild( getFeatureDhcTypePostElement );
259 QDomElement transactionElement = doc.createElement( QStringLiteral(
"Transaction" ) );
260 requestElement.appendChild( transactionElement );
261 QDomElement transactionDhcTypeElement = dcpTypeElement.cloneNode().toElement();
262 transactionDhcTypeElement.firstChild().firstChild().toElement().setTagName( QStringLiteral(
"Post" ) );
263 transactionElement.appendChild( transactionDhcTypeElement );
265 return capabilityElement;
270 #ifdef HAVE_SERVER_PYTHON_PLUGINS 277 QDomElement featureTypeListElement = doc.createElement( QStringLiteral(
"FeatureTypeList" ) );
279 QDomElement operationsElement = doc.createElement( QStringLiteral(
"Operations" ) );
280 featureTypeListElement.appendChild( operationsElement );
282 QDomElement queryElement = doc.createElement( QStringLiteral(
"Query" ) );
283 operationsElement.appendChild( queryElement );
289 for (
const QString &wfsLayerId : wfsLayerIds )
300 #ifdef HAVE_SERVER_PYTHON_PLUGINS 306 QDomElement layerElem = doc.createElement( QStringLiteral(
"FeatureType" ) );
309 QDomElement nameElem = doc.createElement( QStringLiteral(
"Name" ) );
313 typeName = typeName.replace( QLatin1String(
" " ), QLatin1String(
"_" ) );
314 QDomText nameText = doc.createTextNode( typeName );
315 nameElem.appendChild( nameText );
316 layerElem.appendChild( nameElem );
319 QDomElement titleElem = doc.createElement( QStringLiteral(
"Title" ) );
320 QString title = layer->
title();
321 if ( title.isEmpty() )
323 title = layer->
name();
325 QDomText titleText = doc.createTextNode( title );
326 titleElem.appendChild( titleText );
327 layerElem.appendChild( titleElem );
330 QString
abstract = layer->
abstract();
331 if ( !
abstract.isEmpty() )
333 QDomElement abstractElem = doc.createElement( QStringLiteral(
"Abstract" ) );
334 QDomText abstractText = doc.createTextNode(
abstract );
335 abstractElem.appendChild( abstractText );
336 layerElem.appendChild( abstractElem );
341 if ( !keywords.isEmpty() )
343 QDomElement keywordsElem = doc.createElement( QStringLiteral(
"Keywords" ) );
344 QDomText keywordsText = doc.createTextNode( keywords );
345 keywordsElem.appendChild( keywordsText );
346 layerElem.appendChild( keywordsElem );
350 QDomElement srsElem = doc.createElement( QStringLiteral(
"SRS" ) );
351 QDomText srsText = doc.createTextNode( layer->
crs().
authid() );
352 srsElem.appendChild( srsText );
353 layerElem.appendChild( srsElem );
357 QDomElement bBoxElement = doc.createElement( QStringLiteral(
"LatLongBoundingBox" ) );
358 bBoxElement.setAttribute( QStringLiteral(
"minx" ), QString::number( layerExtent.
xMinimum() ) );
359 bBoxElement.setAttribute( QStringLiteral(
"miny" ), QString::number( layerExtent.
yMinimum() ) );
360 bBoxElement.setAttribute( QStringLiteral(
"maxx" ), QString::number( layerExtent.
xMaximum() ) );
361 bBoxElement.setAttribute( QStringLiteral(
"maxy" ), QString::number( layerExtent.
yMaximum() ) );
362 layerElem.appendChild( bBoxElement );
366 if ( !metadataUrl.isEmpty() )
368 QDomElement metaUrlElem = doc.createElement( QStringLiteral(
"MetadataURL" ) );
370 metaUrlElem.setAttribute( QStringLiteral(
"type" ), metadataUrlType );
372 if ( metadataUrlFormat == QLatin1String(
"text/xml" ) )
374 metaUrlElem.setAttribute( QStringLiteral(
"format" ), QStringLiteral(
"XML" ) );
378 metaUrlElem.setAttribute( QStringLiteral(
"format" ), QStringLiteral(
"TXT" ) );
380 QDomText metaUrlText = doc.createTextNode( metadataUrl );
381 metaUrlElem.appendChild( metaUrlText );
382 layerElem.appendChild( metaUrlElem );
386 QDomElement operationsElement = doc.createElement( QStringLiteral(
"Operations" ) );
388 QDomElement queryElement = doc.createElement( QStringLiteral(
"Query" ) );
389 operationsElement.appendChild( queryElement );
390 if ( wfstUpdateLayersId.contains( layer->
id() ) ||
391 wfstInsertLayersId.contains( layer->
id() ) ||
392 wfstDeleteLayersId.contains( layer->
id() ) )
399 QDomElement insertElement = doc.createElement( QStringLiteral(
"Insert" ) );
400 operationsElement.appendChild( insertElement );
404 wfstUpdateLayersId.contains( layer->
id() ) )
407 QDomElement updateElement = doc.createElement( QStringLiteral(
"Update" ) );
408 operationsElement.appendChild( updateElement );
413 QDomElement deleteElement = doc.createElement( QStringLiteral(
"Delete" ) );
414 operationsElement.appendChild( deleteElement );
418 layerElem.appendChild( operationsElement );
420 featureTypeListElement.appendChild( layerElem );
423 return featureTypeListElement;
QDomElement getCapabilityElement(QDomDocument &doc, const QgsProject *project, const QgsServerRequest &request)
Create Capability element for get capabilities document.
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...
A rectangle specified with double values.
Base class for all map layer types.
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...
QgsMapLayerType type() const
Returns the type of the layer.
SERVER_EXPORT QStringList owsServiceKeywords(const QgsProject &project)
Returns the owsService keywords defined in project.
QString shortName() const
Returns the short name of the layer used by QGIS Server to identify the layer.
QDomDocument createGetCapabilitiesDocument(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request)
Create get capabilities document.
SERVER_EXPORT QString owsServiceAbstract(const QgsProject &project)
Returns the owsService abstract defined in project.
QString abstract() const
Returns the abstract of the layer used by QGIS Server in GetCapabilities request. ...
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device...
virtual QgsRectangle extent() const
Returns the extent of the layer.
QString metadataUrlFormat() const
Returns the metadata format of the layer used by QGIS Server in GetCapabilities request.
QString serviceUrl(const QgsServerRequest &request, const QgsProject *project)
Service URL string.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
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...
QString keywordList() const
Returns the keyword list of the layer used by QGIS Server in GetCapabilities request.
const QString GML_NAMESPACE
void writeGetCapabilities(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WFS GetCapabilities response.
const QString WFS_NAMESPACE
A helper class that centralizes caches accesses given by all the server cache filter plugins...
Allows modifications of geometries.
Reads and writes project states.
SERVER_EXPORT QString owsServiceFees(const QgsProject &project)
Returns the owsService fees defined in project.
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.
SERVER_EXPORT QString owsServiceAccessConstraints(const QgsProject &project)
Returns the owsService access constraints defined in project.
SERVER_EXPORT QString owsServiceOnlineResource(const QgsProject &project)
Returns the owsService online resource defined in project.
QString title() const
Returns the title of the layer used by QGIS Server in GetCapabilities request.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
const QString OGC_NAMESPACE
double xMaximum() const
Returns the x maximum value (right side of rectangle).
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 getServiceElement(QDomDocument &doc, const QgsProject *project)
Create Service element for get capabilities document.
SERVER_EXPORT QStringList wfsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WFS.
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.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
A helper class that centralizes restrictions given by all the access control filter plugins...
QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
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...
QString metadataUrl() const
Returns the metadata URL of the layer used by QGIS Server in GetCapabilities request.
Allows deletion of features.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
virtual QgsAccessControl * accessControls() const =0
Gets the registered access control filters.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QDomElement getFeatureTypeListElement(QDomDocument &doc, QgsServerInterface *serverIface, const QgsProject *project)
Create FeatureTypeList element for get capabilities document.
This is the base class for vector data providers.
Represents a vector layer which manages a vector based data sets.
Allows modification of attribute values.
QString authid() const
Returns the authority identifier for the CRS.
SERVER_EXPORT QString owsServiceTitle(const QgsProject &project)
Returns the owsService title defined in project.
QgsCoordinateReferenceSystem crs
QString metadataUrlType() const
Returns the metadata type of the layer used by QGIS Server in GetCapabilities request.