33 : wfsParameters( wfsParams )
39#ifdef HAVE_SERVER_PYTHON_PLUGINS
43 const QDomDocument *describeDocument =
nullptr;
45#ifdef HAVE_SERVER_PYTHON_PLUGINS
47 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
49 describeDocument = &doc;
53 doc = createDescribeFeatureTypeDocument( serverIface, project, version, request );
59 describeDocument = &doc;
62 doc = createDescribeFeatureTypeDocument( serverIface, project, version, request );
63 describeDocument = &doc;
65 response.
setHeader(
"Content-Type",
"text/xml; charset=utf-8" );
66 response.
write( describeDocument->toByteArray() );
70QDomDocument QgsWfsDescribeFeatureTypeGml::createDescribeFeatureTypeDocument(
QgsServerInterface *serverIface,
const QgsProject *project,
const QString &version,
77#ifdef HAVE_SERVER_PYTHON_PLUGINS
86 QDomElement schemaElement = doc.createElement( QStringLiteral(
"schema" ) );
87 schemaElement.setAttribute( QStringLiteral(
"xmlns" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema" ) );
88 schemaElement.setAttribute( QStringLiteral(
"xmlns:xsd" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema" ) );
89 schemaElement.setAttribute( QStringLiteral(
"xmlns:ogc" ),
OGC_NAMESPACE );
90 schemaElement.setAttribute( QStringLiteral(
"xmlns:gml" ),
GML_NAMESPACE );
91 schemaElement.setAttribute( QStringLiteral(
"xmlns:qgs" ),
QGS_NAMESPACE );
92 schemaElement.setAttribute( QStringLiteral(
"targetNamespace" ),
QGS_NAMESPACE );
93 schemaElement.setAttribute( QStringLiteral(
"elementFormDefault" ), QStringLiteral(
"qualified" ) );
94 schemaElement.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.0" ) );
95 doc.appendChild( schemaElement );
98 QDomElement importElement = doc.createElement( QStringLiteral(
"import" ) );
99 importElement.setAttribute( QStringLiteral(
"namespace" ),
GML_NAMESPACE );
100 if ( outputFormat == QgsWfsParameters::Format::GML2 )
101 importElement.setAttribute( QStringLiteral(
"schemaLocation" ), QStringLiteral(
"http://schemas.opengis.net/gml/2.1.2/feature.xsd" ) );
102 else if ( outputFormat == QgsWfsParameters::Format::GML3 )
103 importElement.setAttribute( QStringLiteral(
"schemaLocation" ), QStringLiteral(
"http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" ) );
104 schemaElement.appendChild( importElement );
109 for (
int i = 0; i < wfsLayerIds.size(); ++i )
119 if ( !typeNameList.isEmpty() && !typeNameList.contains( name ) )
123#ifdef HAVE_SERVER_PYTHON_PLUGINS
126 if ( !typeNameList.isEmpty() )
142 setSchemaLayer( schemaElement, doc,
const_cast<QgsVectorLayer *
>( vLayer ) );
147void QgsWfsDescribeFeatureTypeGml::setSchemaLayer( QDomElement &parentElement, QDomDocument &doc,
const QgsVectorLayer *layer )
const
158 QDomElement elementElem = doc.createElement( QStringLiteral(
"element" ) );
159 elementElem.setAttribute( QStringLiteral(
"name" ),
typeName );
160 elementElem.setAttribute( QStringLiteral(
"type" ),
"qgs:" +
typeName +
"Type" );
161 elementElem.setAttribute( QStringLiteral(
"substitutionGroup" ), QStringLiteral(
"gml:_Feature" ) );
162 parentElement.appendChild( elementElem );
165 QDomElement complexTypeElem = doc.createElement( QStringLiteral(
"complexType" ) );
166 complexTypeElem.setAttribute( QStringLiteral(
"name" ),
typeName +
"Type" );
167 parentElement.appendChild( complexTypeElem );
170 QDomElement complexContentElem = doc.createElement( QStringLiteral(
"complexContent" ) );
171 complexTypeElem.appendChild( complexContentElem );
174 QDomElement extensionElem = doc.createElement( QStringLiteral(
"extension" ) );
175 extensionElem.setAttribute( QStringLiteral(
"base" ), QStringLiteral(
"gml:AbstractFeatureType" ) );
176 complexContentElem.appendChild( extensionElem );
179 QDomElement sequenceElem = doc.createElement( QStringLiteral(
"sequence" ) );
180 extensionElem.appendChild( sequenceElem );
185 QDomElement geomElem = doc.createElement( QStringLiteral(
"element" ) );
186 geomElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
187 geomElem.setAttribute( QStringLiteral(
"type" ), getGmlGeometryType( layer ) );
188 geomElem.setAttribute( QStringLiteral(
"minOccurs" ), QStringLiteral(
"0" ) );
189 geomElem.setAttribute( QStringLiteral(
"maxOccurs" ), QStringLiteral(
"1" ) );
190 sequenceElem.appendChild( geomElem );
196 for (
int idx = 0; idx < fields.
count(); ++idx )
205 QString attributeName, attributeType;
211 QDomElement attElem = doc.createElement( QStringLiteral(
"element" ) );
213 attElem.setAttribute( QStringLiteral(
"name" ), attributeName );
214 attElem.setAttribute( QStringLiteral(
"type" ), attributeType );
218 attElem.setAttribute( QStringLiteral(
"nillable" ), QStringLiteral(
"true" ) );
221 sequenceElem.appendChild( attElem );
223 const QString alias = field.
alias();
224 if ( !alias.isEmpty() )
226 attElem.setAttribute( QStringLiteral(
"alias" ), alias );
231QString QgsWfsDescribeFeatureTypeGml::getGmlGeometryType(
const QgsVectorLayer *layer )
const
236 case QgsWfsParameters::Format::GML2:
241 return QStringLiteral(
"gml:PointPropertyType" );
245 return QStringLiteral(
"gml:LineStringPropertyType" );
249 return QStringLiteral(
"gml:PolygonPropertyType" );
253 return QStringLiteral(
"gml:MultiPointPropertyType" );
258 return QStringLiteral(
"gml:MultiLineStringPropertyType" );
263 return QStringLiteral(
"gml:MultiPolygonPropertyType" );
266 return QStringLiteral(
"gml:GeometryPropertyType" );
269 case QgsWfsParameters::Format::GML3:
274 return QStringLiteral(
"gml:PointPropertyType" );
278 return QStringLiteral(
"gml:LineStringPropertyType" );
282 return QStringLiteral(
"gml:PolygonPropertyType" );
286 return QStringLiteral(
"gml:MultiPointPropertyType" );
291 return QStringLiteral(
"gml:MultiCurvePropertyType" );
296 return QStringLiteral(
"gml:MultiSurfacePropertyType" );
299 return QStringLiteral(
"gml:GeometryPropertyType" );
302 return QStringLiteral(
"gml:GeometryPropertyType" );
WkbType
The WKB type describes the number of dimensions a geometry has.
@ LineString25D
LineString25D.
@ MultiPolygon25D
MultiPolygon25D.
@ MultiLineString25D
MultiLineString25D.
@ MultiPolygon
MultiPolygon.
@ MultiLineString
MultiLineString.
@ MultiPoint25D
MultiPoint25D.
@ MultiSurface
MultiSurface.
@ HideFromWfs
Field is not available if layer is served as WFS from QGIS server.
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.
@ ConstraintNotNull
Field may not be null.
Encapsulate a field in an attribute table or data source.
Qgis::FieldConfigurationFlags configurationFlags
QgsFieldConstraints constraints
Container of fields for a vector layer.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Base class for all map layer types.
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 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.
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...
This is the base class for vector data providers.
Represents a vector layer which manages a vector based data sets.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QgsFields fields() const FINAL
Returns the list of fields of this layer.
Q_INVOKABLE Qgis::WkbType wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
void writeDescribeFeatureType(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response) const
Output GML response.
QgsWfsDescribeFeatureTypeGml(const QgsWfs::QgsWfsParameters wfsParams)
Constructor.
Exception thrown when data access violates access controls.
Provides an interface to retrieve and manipulate WFS parameters received from the client.
Format outputFormat() const
Returns format.
SERVER_EXPORT QStringList wfsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WFS.
QString layerTypeName(const QgsMapLayer *layer)
Returns typename from vector layer.
void getFieldAttributes(const QgsField &field, QString &fieldName, QString &fieldType)
Helper for returning the field type and type name.
const QString QGS_NAMESPACE
QStringList getRequestTypeNames(const QgsServerRequest &request, const QgsWfsParameters &wfsParams)
Helper for returning typename list from the request.