33 : wfsParameters( wfsParams )
38#ifdef HAVE_SERVER_PYTHON_PLUGINS
42 const QDomDocument *describeDocument =
nullptr;
44#ifdef HAVE_SERVER_PYTHON_PLUGINS
46 if ( cacheManager && cacheManager->
getCachedDocument( &doc, project, request, accessControl ) )
48 describeDocument = &doc;
52 doc = createDescribeFeatureTypeDocument( serverIface, project, version, request );
58 describeDocument = &doc;
61 doc = createDescribeFeatureTypeDocument( serverIface, project, version, request );
62 describeDocument = &doc;
64 response.
setHeader(
"Content-Type",
"text/xml; charset=utf-8" );
65 response.
write( describeDocument->toByteArray() );
75#ifdef HAVE_SERVER_PYTHON_PLUGINS
84 QDomElement schemaElement = doc.createElement( QStringLiteral(
"schema" ) );
85 schemaElement.setAttribute( QStringLiteral(
"xmlns" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema" ) );
86 schemaElement.setAttribute( QStringLiteral(
"xmlns:xsd" ), QStringLiteral(
"http://www.w3.org/2001/XMLSchema" ) );
87 schemaElement.setAttribute( QStringLiteral(
"xmlns:ogc" ),
OGC_NAMESPACE );
88 schemaElement.setAttribute( QStringLiteral(
"xmlns:gml" ),
GML_NAMESPACE );
89 schemaElement.setAttribute( QStringLiteral(
"xmlns:qgs" ),
QGS_NAMESPACE );
90 schemaElement.setAttribute( QStringLiteral(
"targetNamespace" ),
QGS_NAMESPACE );
91 schemaElement.setAttribute( QStringLiteral(
"elementFormDefault" ), QStringLiteral(
"qualified" ) );
92 schemaElement.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.0" ) );
93 doc.appendChild( schemaElement );
96 QDomElement importElement = doc.createElement( QStringLiteral(
"import" ) );
97 importElement.setAttribute( QStringLiteral(
"namespace" ),
GML_NAMESPACE );
98 if ( outputFormat == QgsWfsParameters::Format::GML2 )
99 importElement.setAttribute( QStringLiteral(
"schemaLocation" ), QStringLiteral(
"http://schemas.opengis.net/gml/2.1.2/feature.xsd" ) );
100 else if ( outputFormat == QgsWfsParameters::Format::GML3 )
101 importElement.setAttribute( QStringLiteral(
"schemaLocation" ), QStringLiteral(
"http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" ) );
102 schemaElement.appendChild( importElement );
107 for (
int i = 0; i < wfsLayerIds.size(); ++i )
117 if ( !typeNameList.isEmpty() && !typeNameList.contains( name ) )
121#ifdef HAVE_SERVER_PYTHON_PLUGINS
124 if ( !typeNameList.isEmpty() )
140 setSchemaLayer( schemaElement, doc,
const_cast<QgsVectorLayer *
>( vLayer ) );
145void QgsWfsDescribeFeatureTypeGml::setSchemaLayer( QDomElement &parentElement, QDomDocument &doc,
const QgsVectorLayer *layer )
const
156 QDomElement elementElem = doc.createElement( QStringLiteral(
"element" ) );
157 elementElem.setAttribute( QStringLiteral(
"name" ),
typeName );
158 elementElem.setAttribute( QStringLiteral(
"type" ),
"qgs:" +
typeName +
"Type" );
159 elementElem.setAttribute( QStringLiteral(
"substitutionGroup" ), QStringLiteral(
"gml:_Feature" ) );
160 parentElement.appendChild( elementElem );
163 QDomElement complexTypeElem = doc.createElement( QStringLiteral(
"complexType" ) );
164 complexTypeElem.setAttribute( QStringLiteral(
"name" ),
typeName +
"Type" );
165 parentElement.appendChild( complexTypeElem );
168 QDomElement complexContentElem = doc.createElement( QStringLiteral(
"complexContent" ) );
169 complexTypeElem.appendChild( complexContentElem );
172 QDomElement extensionElem = doc.createElement( QStringLiteral(
"extension" ) );
173 extensionElem.setAttribute( QStringLiteral(
"base" ), QStringLiteral(
"gml:AbstractFeatureType" ) );
174 complexContentElem.appendChild( extensionElem );
177 QDomElement sequenceElem = doc.createElement( QStringLiteral(
"sequence" ) );
178 extensionElem.appendChild( sequenceElem );
183 QDomElement geomElem = doc.createElement( QStringLiteral(
"element" ) );
184 geomElem.setAttribute( QStringLiteral(
"name" ), QStringLiteral(
"geometry" ) );
185 geomElem.setAttribute( QStringLiteral(
"type" ), getGmlGeometryType( layer ) );
186 geomElem.setAttribute( QStringLiteral(
"minOccurs" ), QStringLiteral(
"0" ) );
187 geomElem.setAttribute( QStringLiteral(
"maxOccurs" ), QStringLiteral(
"1" ) );
188 sequenceElem.appendChild( geomElem );
194 for (
int idx = 0; idx < fields.
count(); ++idx )
203 QString attributeName, attributeType;
209 QDomElement attElem = doc.createElement( QStringLiteral(
"element" ) );
211 attElem.setAttribute( QStringLiteral(
"name" ), attributeName );
212 attElem.setAttribute( QStringLiteral(
"type" ), attributeType );
216 attElem.setAttribute( QStringLiteral(
"nillable" ), QStringLiteral(
"true" ) );
219 sequenceElem.appendChild( attElem );
221 const QString alias = field.
alias();
222 if ( !alias.isEmpty() )
224 attElem.setAttribute( QStringLiteral(
"alias" ), alias );
229QString QgsWfsDescribeFeatureTypeGml::getGmlGeometryType(
const QgsVectorLayer *layer )
const
234 case QgsWfsParameters::Format::GML2:
239 return QStringLiteral(
"gml:PointPropertyType" );
243 return QStringLiteral(
"gml:LineStringPropertyType" );
247 return QStringLiteral(
"gml:PolygonPropertyType" );
251 return QStringLiteral(
"gml:MultiPointPropertyType" );
256 return QStringLiteral(
"gml:MultiLineStringPropertyType" );
261 return QStringLiteral(
"gml:MultiPolygonPropertyType" );
264 return QStringLiteral(
"gml:GeometryPropertyType" );
266 case QgsWfsParameters::Format::GML3:
271 return QStringLiteral(
"gml:PointPropertyType" );
275 return QStringLiteral(
"gml:LineStringPropertyType" );
279 return QStringLiteral(
"gml:PolygonPropertyType" );
283 return QStringLiteral(
"gml:MultiPointPropertyType" );
288 return QStringLiteral(
"gml:MultiCurvePropertyType" );
293 return QStringLiteral(
"gml:MultiSurfacePropertyType" );
296 return QStringLiteral(
"gml:GeometryPropertyType" );
299 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.
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.
Defines 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.
static QStringList wfsLayerIds(const QgsProject &project)
Returns the Layer ids list defined in a QGIS project as published in WFS.
Defines requests passed to QgsService classes.
Defines the response interface passed to QgsService.
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...
Base class for vector data providers.
Represents a vector layer which manages a vector based dataset.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
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.
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.