QGIS API Documentation 3.29.0-Master (d0a9f12494)
qgswfsdescribefeaturetype.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgswfsdescribefeaturetype.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 <QDomDocument>
23#include <QDomElement>
24
25#include "qgswfsutils.h"
30#include "qgswfsparameters.h"
31#include "qgsproject.h"
32#include "qgsvectorlayer.h"
34
35namespace QgsWfs
36{
37 void writeDescribeFeatureType( QgsServerInterface *serverIface, const QgsProject *project, const QString &version,
38 const QgsServerRequest &request, QgsServerResponse &response )
39 {
40 const QgsWfsParameters wfsParameters( QUrlQuery( request.url() ) );
41 const QgsWfsParameters::Format oFormat = wfsParameters.outputFormat();
42
43 // test oFormat
44 switch ( oFormat )
45 {
46 case QgsWfsParameters::Format::GML2:
47 case QgsWfsParameters::Format::GML3:
48 {
49 auto formatter = QgsWfsDescribeFeatureTypeGml( wfsParameters );
50 formatter.writeDescribeFeatureType( serverIface, project, version, request, response );
51 }
52 break;
53
54 case QgsWfsParameters::Format::GeoJSON:
55 {
56 auto formatter = QgsWfsDescribeFeatureTypeJson( wfsParameters );
57 formatter.writeDescribeFeatureType( serverIface, project, version, request, response );
58 }
59 break;
60
61 default:
62 throw QgsBadRequestException( QStringLiteral( "Invalid WFS Parameter" ),
63 QStringLiteral( "OUTPUTFORMAT %1 is not supported" ).arg( wfsParameters.outputFormatAsString() ) );
64
65 }
66 }
67
68 QStringList getRequestTypeNames( const QgsServerRequest &request, const QgsWfsParameters &wfsParams )
69 {
70 QStringList typeNameList;
71 QDomDocument queryDoc;
72 QString errorMsg;
73 if ( queryDoc.setContent( request.data(), true, &errorMsg ) )
74 {
75 //read doc
76 const QDomElement queryDocElem = queryDoc.documentElement();
77 const QDomNodeList docChildNodes = queryDocElem.childNodes();
78 if ( docChildNodes.size() )
79 {
80 for ( int i = 0; i < docChildNodes.size(); i++ )
81 {
82 const QDomElement docChildElem = docChildNodes.at( i ).toElement();
83 if ( docChildElem.tagName() == QLatin1String( "TypeName" ) )
84 {
85 const QString typeName = docChildElem.text().trimmed();
86 if ( typeName.contains( ':' ) )
87 typeNameList << typeName.section( ':', 1, 1 );
88 else
89 typeNameList << typeName;
90 }
91 }
92 }
93 }
94 else
95 {
96 typeNameList = wfsParams.typeNames();
97 }
98
99 return typeNameList;
100 }
101
102
103 void getFieldAttributes( const QgsField &field, QString &fieldName, QString &fieldType )
104 {
105 fieldName = field.name();
106
107 const thread_local QRegularExpression sCleanTagNameRegExp( QStringLiteral( "[^\\w\\.-_]" ), QRegularExpression::PatternOption::UseUnicodePropertiesOption );
108 fieldName.replace( ' ', '_' ).replace( sCleanTagNameRegExp, QString() );
109
110 const QVariant::Type attributeType = field.type();
111
112 if ( attributeType == QVariant::Int )
113 {
114 fieldType = QStringLiteral( "int" );
115 }
116 else if ( attributeType == QVariant::UInt )
117 {
118 fieldType = QStringLiteral( "unsignedInt" );
119 }
120 else if ( attributeType == QVariant::LongLong )
121 {
122 fieldType = QStringLiteral( "long" );
123 }
124 else if ( attributeType == QVariant::ULongLong )
125 {
126 fieldType = QStringLiteral( "unsignedLong" );
127 }
128 else if ( attributeType == QVariant::Double )
129 {
130 if ( field.length() > 0 && field.precision() == 0 )
131 fieldType = QStringLiteral( "integer" );
132 else
133 fieldType = QStringLiteral( "decimal" );
134 }
135 else if ( attributeType == QVariant::Bool )
136 {
137 fieldType = QStringLiteral( "boolean" );
138 }
139 else if ( attributeType == QVariant::Date )
140 {
141 fieldType = QStringLiteral( "date" );
142 }
143 else if ( attributeType == QVariant::Time )
144 {
145 fieldType = QStringLiteral( "time" );
146 }
147 else if ( attributeType == QVariant::DateTime )
148 {
149 fieldType = QStringLiteral( "dateTime" );
150 }
151 else
152 {
153 fieldType = QStringLiteral( "string" );
154 }
155
157 if ( setup.type() == QStringLiteral( "DateTime" ) )
158 {
159 // Get editor widget setup config
160 const QVariantMap config = setup.config();
161 // Get field format from editor widget setup config
162 const QString fieldFormat = config.value(
163 QStringLiteral( "field_format" ),
165 ).toString();
166 // Define type from field format
167 if ( fieldFormat == QgsDateTimeFieldFormatter::TIME_FORMAT ) // const TIME_FORMAT
168 fieldType = QStringLiteral( "time" );
169 else if ( fieldFormat == QLatin1String( "yyyy-MM-dd" ) ) // QgsDateTimeFieldFormatter provide a local date format
170 fieldType = QStringLiteral( "date" );
171 else
172 fieldType = QStringLiteral( "dateTime" );
173 }
174 else if ( setup.type() == QStringLiteral( "Range" ) )
175 {
176 const QVariantMap config = setup.config();
177 if ( config.contains( QStringLiteral( "Precision" ) ) )
178 {
179 // if precision in range config is not the same as the attributePrec
180 // we need to update type
181 bool ok;
182 const int configPrec( config[ QStringLiteral( "Precision" ) ].toInt( &ok ) );
183 if ( ok && configPrec != field.precision() )
184 {
185 if ( configPrec == 0 )
186 fieldType = QStringLiteral( "integer" );
187 else
188 fieldType = QStringLiteral( "decimal" );
189 }
190 }
191 }
192 }
193
194
195} // namespace QgsWfs
static QString defaultFormat(QVariant::Type type)
Gets the default format in function of the type.
Holder for the widget type and its configuration for a field.
QVariantMap config() const
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
QString name
Definition: qgsfield.h:60
int precision
Definition: qgsfield.h:57
int length
Definition: qgsfield.h:56
QVariant::Type type
Definition: qgsfield.h:58
QgsEditorWidgetSetup editorWidgetSetup() const
Gets the editor widget setup for the field.
Definition: qgsfield.cpp:631
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition: qgsproject.h:106
QgsServerInterface Class defining interfaces exposed by QGIS Server and made available to plugins.
QgsServerRequest Class defining request interface passed to services QgsService::executeRequest() met...
virtual QByteArray data() const
Returns post/put data Check for QByteArray::isNull() to check if data is available.
QgsServerResponse Class defining response interface passed to services QgsService::executeRequest() m...
GML output formatter for DescribeFeatureType.
Json output formatter for DescribeFeatureType.
Exception thrown in case of malformed request.
Provides an interface to retrieve and manipulate WFS parameters received from the client.
QStringList typeNames() const
Returns TYPENAME parameter as list.
QString outputFormatAsString() const
Returns OUTPUTFORMAT parameter as a string.
Format
Output format for the response.
Format outputFormat() const
Returns format.
WMS implementation.
Definition: qgswfs.cpp:36
void getFieldAttributes(const QgsField &field, QString &fieldName, QString &fieldType)
Helper for returning the field type and type name.
void writeDescribeFeatureType(QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response)
Output WFS GetCapabilities response.
QStringList getRequestTypeNames(const QgsServerRequest &request, const QgsWfsParameters &wfsParams)
Helper for returning typename list from the request.
const QgsField & field
Definition: qgsfield.h:463
const QString & typeName