QGIS API Documentation 3.43.0-Master (b60ef06885e)
qgsmaplayerserverproperties.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaplayerserverproperties.cpp
3 ------------------
4 begin : June 21, 2021
5 copyright : (C) 2021 by Etienne Trimaille
6 email : etrimaille at 3liz dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19#include "moc_qgsmaplayerserverproperties.cpp"
20#include "qgsmaplayer.h"
22
23#include <QDomNode>
24
25// QgsServerMetadataUrlProperties
26
28{
29 return url == other.url &&
30 type == other.type &&
31 format == other.format;
32}
33
38
40{
41 mMetadataUrls.clear();
42}
43
44void QgsServerMetadataUrlProperties::readXml( const QDomNode &layer_node )
45{
46 QDomElement element = layer_node.namedItem( QStringLiteral( "metadataUrls" ) ).toElement();
47 mMetadataUrls.clear();
48 const QDomNodeList el = element.elementsByTagName( QStringLiteral( "metadataUrl" ) );
49 for ( int i = 0; i < el.size(); i++ )
50 {
51 element = el.at( i ).toElement();
53 oneUrl.type = element.attribute( QStringLiteral( "type" ) );
54 oneUrl.format = element.attribute( QStringLiteral( "format" ) );
55 oneUrl.url = element.text();
56 addMetadataUrl( oneUrl );
57 }
58}
59
60void QgsServerMetadataUrlProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
61{
62 if ( !mMetadataUrls.empty() )
63 {
64 QDomElement urls = document.createElement( QStringLiteral( "metadataUrls" ) );
65 for ( const QgsMapLayerServerProperties::MetadataUrl &url : mMetadataUrls )
66 {
67 QDomElement urlElement = document.createElement( QStringLiteral( "metadataUrl" ) );
68 urlElement.setAttribute( QStringLiteral( "type" ), url.type );
69 urlElement.setAttribute( QStringLiteral( "format" ), url.format );
70 urlElement.appendChild( document.createTextNode( url.url ) );
71 urls.appendChild( urlElement );
72 }
73 layer_node.appendChild( urls );
74 }
75}
76
77// QgsServerWmsDimensionProperties
78
80{
81 properties->setWmsDimensions( wmsDimensions() );
82}
83
85{
86 mWmsDimensions.clear();
87}
88
89void QgsServerWmsDimensionProperties::setWmsDimensions( const QList<QgsServerWmsDimensionProperties::WmsDimensionInfo> &dimensions )
90{
91 mWmsDimensions = dimensions;
92}
93
95{
96 QMap<int, QString> labels;
97 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::AllValues] = QObject::tr( "All values" );
98 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::MinValue] = QObject::tr( "Min value" );
99 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::MaxValue] = QObject::tr( "Max value" );
100 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::ReferenceValue] = QObject::tr( "Reference value" );
101 return labels;
102}
103
105{
106 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : std::as_const( mWmsDimensions ) )
107 {
108 if ( dim.name == wmsDimInfo.name )
109 {
110 return false;
111 }
112 }
113 mWmsDimensions.append( wmsDimInfo );
114 return true;
115}
116
118{
119 for ( int i = 0; i < mWmsDimensions.size(); ++i )
120 {
121 if ( mWmsDimensions[ i ].name == wmsDimName )
122 {
123 mWmsDimensions.removeAt( i );
124 return true;
125 }
126 }
127 return false;
128}
129
130const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > QgsServerWmsDimensionProperties::wmsDimensions() const
131{
132 return mWmsDimensions;
133}
134
135void QgsServerWmsDimensionProperties::readXml( const QDomNode &layer_node )
136{
137 reset();
138
139 // Apply only for vector layers
140 if ( layer()->type() != Qgis::LayerType::Vector )
141 return;
142
143 const QgsFields fields = static_cast<const QgsVectorLayer *>( layer() )->fields();
144 // QGIS Server WMS Dimensions
145 const QDomNode wmsDimsNode = layer_node.namedItem( QStringLiteral( "wmsDimensions" ) );
146 if ( wmsDimsNode.isNull() )
147 {
148 return;
149 }
150 const QDomElement wmsDimsElem = wmsDimsNode.toElement();
151 const QDomNodeList wmsDimsList = wmsDimsElem.elementsByTagName( QStringLiteral( "dimension" ) );
152 for ( int i = 0; i < wmsDimsList.size(); ++i )
153 {
154 const QDomElement dimElem = wmsDimsList.at( i ).toElement();
155 const QString dimName = dimElem.attribute( QStringLiteral( "name" ) );
156 const QString dimFieldName = dimElem.attribute( QStringLiteral( "fieldName" ) );
157 // check field name
158 const int dimFieldNameIndex = fields.indexOf( dimFieldName );
159 if ( dimFieldNameIndex == -1 )
160 {
161 continue;
162 }
163 QVariant dimRefValue;
164 const int dimDefaultDisplayType = dimElem.attribute( QStringLiteral( "defaultDisplayType" ) ).toInt();
166 {
167 const QString dimRefValueStr = dimElem.attribute( QStringLiteral( "referenceValue" ) );
168 if ( !dimRefValueStr.isEmpty() )
169 {
170 const QgsField dimField = fields.at( dimFieldNameIndex );
171 dimRefValue = QVariant( dimRefValueStr );
172 if ( !dimField.convertCompatible( dimRefValue ) )
173 {
174 continue;
175 }
176 }
177 }
178 QgsServerWmsDimensionProperties::WmsDimensionInfo dim( dimName, dimFieldName,
179 dimElem.attribute( QStringLiteral( "endFieldName" ) ),
180 dimElem.attribute( QStringLiteral( "units" ) ),
181 dimElem.attribute( QStringLiteral( "unitSymbol" ) ),
182 dimDefaultDisplayType, dimRefValue );
183 //XXX This add O(n^2) complexity !!!!
184 // addWmsDimension( dim );
185 // Better to trust the XML:
186 mWmsDimensions.append( dim );
187 }
188}
189
190void QgsServerWmsDimensionProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
191{
192 // save QGIS Server WMS Dimension definitions
193 if ( ! mWmsDimensions.isEmpty() )
194 {
195 QDomElement wmsDimsElem = document.createElement( QStringLiteral( "wmsDimensions" ) );
196 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : mWmsDimensions )
197 {
198 QDomElement dimElem = document.createElement( QStringLiteral( "dimension" ) );
199 dimElem.setAttribute( QStringLiteral( "name" ), dim.name );
200 dimElem.setAttribute( QStringLiteral( "fieldName" ), dim.fieldName );
201 dimElem.setAttribute( QStringLiteral( "endFieldName" ), dim.endFieldName );
202 dimElem.setAttribute( QStringLiteral( "units" ), dim.units );
203 dimElem.setAttribute( QStringLiteral( "unitSymbol" ), dim.unitSymbol );
204 dimElem.setAttribute( QStringLiteral( "defaultDisplayType" ), dim.defaultDisplayType );
205 dimElem.setAttribute( QStringLiteral( "referenceValue" ), dim.referenceValue.toString() );
206 wmsDimsElem.appendChild( dimElem );
207 }
208 layer_node.appendChild( wmsDimsElem );
209 }
210}
211
212
213// QgsMapLayerServerProperties
214
219
221{
224
225 properties->setShortName( mShortName );
226 properties->setTitle( mTitle );
227 properties->setAbstract( mAbstract );
228 properties->setKeywordList( mKeywordList );
229 properties->setDataUrl( mDataUrl );
230 properties->setDataUrlFormat( mDataUrlFormat );
231 properties->setAttribution( mAttribution );
232 properties->setAttributionUrl( mAttributionUrl );
233 properties->setLegendUrl( mLegendUrl );
234 properties->setLegendUrlFormat( mLegendUrlFormat );
235}
236
242
243void QgsMapLayerServerProperties::readXml( const QDomNode &layerNode ) // cppcheck-suppress duplInheritedMember
244{
246 if ( metadataUrls().isEmpty() )
247 {
248 // metadataUrl is still empty, maybe it's a QGIS Project < 3.22
249 // keep for legacy
250 const QDomElement metaUrlElem = layerNode.firstChildElement( QStringLiteral( "metadataUrl" ) );
251 if ( !metaUrlElem.isNull() )
252 {
253 const QString url = metaUrlElem.text();
254 const QString type = metaUrlElem.attribute( QStringLiteral( "type" ), QString() );
255 const QString format = metaUrlElem.attribute( QStringLiteral( "format" ), QString() );
256 const QgsMapLayerServerProperties::MetadataUrl newItem( url, type, format );
257 setMetadataUrls( QList<QgsMapLayerServerProperties::MetadataUrl>() << newItem );
258 }
259 }
260
262
263 //short name
264 const QDomElement shortNameElem = layerNode.firstChildElement( QStringLiteral( "shortname" ) );
265 if ( !shortNameElem.isNull() )
266 {
267 mShortName = shortNameElem.text();
268 }
269
270 //title
271 const QDomElement titleElem = layerNode.firstChildElement( QStringLiteral( "title" ) );
272 if ( !titleElem.isNull() )
273 {
274 mTitle = titleElem.text();
275 mWfsTitle = titleElem.attribute( QStringLiteral( "wfs" ) );
276 }
277
278 //abstract
279 const QDomElement abstractElem = layerNode.firstChildElement( QStringLiteral( "abstract" ) );
280 if ( !abstractElem.isNull() )
281 {
282 mAbstract = abstractElem.text();
283 }
284
285 //keywordList
286 const QDomElement keywordListElem = layerNode.firstChildElement( QStringLiteral( "keywordList" ) );
287 if ( !keywordListElem.isNull() )
288 {
289 QStringList kwdList;
290 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
291 {
292 const QString keyword = n.toElement().text();
293 if ( !keyword.isEmpty() )
294 kwdList << keyword;
295 }
296 mKeywordList = kwdList.join( QLatin1String( ", " ) );
297 }
298
299 //dataUrl
300 const QDomElement dataUrlElem = layerNode.firstChildElement( QStringLiteral( "dataUrl" ) );
301 if ( !dataUrlElem.isNull() )
302 {
303 mDataUrl = dataUrlElem.text();
304 mDataUrlFormat = dataUrlElem.attribute( QStringLiteral( "format" ), QString() );
305 }
306
307 //attribution
308 const QDomElement attribElem = layerNode.firstChildElement( QStringLiteral( "attribution" ) );
309 if ( !attribElem.isNull() )
310 {
311 mAttribution = attribElem.text();
312 mAttributionUrl = attribElem.attribute( QStringLiteral( "href" ), QString() );
313 }
314
315 //legendUrl
316 const QDomElement legendUrlElem = layerNode.firstChildElement( QStringLiteral( "legendUrl" ) );
317 if ( !legendUrlElem.isNull() )
318 {
319 mLegendUrl = legendUrlElem.text();
320 mLegendUrlFormat = legendUrlElem.attribute( QStringLiteral( "format" ), QString() );
321 }
322}
323
324void QgsMapLayerServerProperties::writeXml( QDomNode &layerNode, QDomDocument &document ) const // cppcheck-suppress duplInheritedMember
325{
326 QgsServerMetadataUrlProperties::writeXml( layerNode, document );
327 QgsServerWmsDimensionProperties::writeXml( layerNode, document );
328
329 // layer short name
330 if ( !mShortName.isEmpty() )
331 {
332 QDomElement layerShortName = document.createElement( QStringLiteral( "shortname" ) );
333 const QDomText layerShortNameText = document.createTextNode( mShortName );
334 layerShortName.appendChild( layerShortNameText );
335 layerNode.appendChild( layerShortName );
336 }
337
338 // layer title
339 if ( !mTitle.isEmpty() )
340 {
341 QDomElement layerTitle = document.createElement( QStringLiteral( "title" ) );
342 const QDomText layerTitleText = document.createTextNode( mTitle );
343 layerTitle.appendChild( layerTitleText );
344
345 if ( mTitle != mWfsTitle )
346 {
347 layerTitle.setAttribute( "wfs", mWfsTitle );
348 }
349
350 layerNode.appendChild( layerTitle );
351 }
352
353 // layer abstract
354 if ( !mAbstract.isEmpty() )
355 {
356 QDomElement layerAbstract = document.createElement( QStringLiteral( "abstract" ) );
357 const QDomText layerAbstractText = document.createTextNode( mAbstract );
358 layerAbstract.appendChild( layerAbstractText );
359 layerNode.appendChild( layerAbstract );
360 }
361
362 // layer keyword list
363 const QStringList keywordStringList = mKeywordList.split( ',', Qt::SkipEmptyParts );
364 if ( !keywordStringList.isEmpty() )
365 {
366 QDomElement layerKeywordList = document.createElement( QStringLiteral( "keywordList" ) );
367 for ( int i = 0; i < keywordStringList.size(); ++i )
368 {
369 QDomElement layerKeywordValue = document.createElement( QStringLiteral( "value" ) );
370 const QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
371 layerKeywordValue.appendChild( layerKeywordText );
372 layerKeywordList.appendChild( layerKeywordValue );
373 }
374 layerNode.appendChild( layerKeywordList );
375 }
376
377 // layer dataUrl
378 if ( !mDataUrl.isEmpty() )
379 {
380 QDomElement layerDataUrl = document.createElement( QStringLiteral( "dataUrl" ) );
381 const QDomText layerDataUrlText = document.createTextNode( mDataUrl );
382 layerDataUrl.appendChild( layerDataUrlText );
383 layerDataUrl.setAttribute( QStringLiteral( "format" ), mDataUrlFormat );
384 layerNode.appendChild( layerDataUrl );
385 }
386
387 // layer legendUrl
388 if ( !mLegendUrl.isEmpty() )
389 {
390 QDomElement layerLegendUrl = document.createElement( QStringLiteral( "legendUrl" ) );
391 const QDomText layerLegendUrlText = document.createTextNode( mLegendUrl );
392 layerLegendUrl.appendChild( layerLegendUrlText );
393 layerLegendUrl.setAttribute( QStringLiteral( "format" ), mLegendUrlFormat );
394 layerNode.appendChild( layerLegendUrl );
395 }
396
397 // layer attribution
398 if ( !mAttribution.isEmpty() )
399 {
400 QDomElement layerAttribution = document.createElement( QStringLiteral( "attribution" ) );
401 const QDomText layerAttributionText = document.createTextNode( mAttribution );
402 layerAttribution.appendChild( layerAttributionText );
403 layerAttribution.setAttribute( QStringLiteral( "href" ), mAttributionUrl );
404 layerNode.appendChild( layerAttribution );
405 }
406}
@ Vector
Vector layer.
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:53
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
Definition qgsfield.cpp:474
Container of fields for a vector layer.
Definition qgsfields.h:46
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Manages QGIS Server properties for a map layer.
void setLegendUrl(const QString &legendUrl)
Sets the URL for the layer's legend.
void readXml(const QDomNode &layer_node)
Reads server properties from project file.
void setDataUrl(const QString &dataUrl)
Sets the DataUrl of the layer used by QGIS Server in GetCapabilities request.
void setAbstract(const QString &abstract)
Sets the abstract of the layer used by QGIS Server in GetCapabilities request.
void setDataUrlFormat(const QString &dataUrlFormat)
Sets the DataUrl format of the layerused by QGIS Server in GetCapabilities request.
void setAttributionUrl(const QString &url)
Sets the attribution url of the layer used by QGIS Server in GetCapabilities request.
void setAttribution(const QString &attrib)
Sets the attribution of the layer used by QGIS Server in GetCapabilities request.
void setShortName(const QString &name)
Sets the short name of the layer used by QGIS Server to identify the layer.
void setLegendUrlFormat(const QString &legendUrlFormat)
Sets the format for a URL based layer legend.
void copyTo(QgsMapLayerServerProperties *properties) const
Copy properties to another instance.
QgsMapLayerServerProperties(QgsMapLayer *layer=nullptr)
Constructor - Creates a Map Layer QGIS Server Properties.
void writeXml(QDomNode &layer_node, QDomDocument &document) const
Saves server properties to xml under the layer node.
void setTitle(const QString &title)
Sets the title of the layer used by QGIS Server in GetCapabilities request.
void setKeywordList(const QString &keywords)
Sets the keywords list of the layerused by QGIS Server in GetCapabilities request.
void reset()
Reset properties to default.
Base class for all map layer types.
Definition qgsmaplayer.h:77
Manages QGIS Server properties for a map layer.
virtual const QgsMapLayer * layer() const =0
Gets the parent layer.
void addMetadataUrl(const QgsServerMetadataUrlProperties::MetadataUrl &metaUrl)
Add a metadataUrl for the layer.
void writeXml(QDomNode &layerNode, QDomDocument &document) const
Saves server properties to xml under the layer node.
void reset()
Reset properties to default.
void setMetadataUrls(const QList< QgsServerMetadataUrlProperties::MetadataUrl > &metaUrls)
Sets a the list of metadata URL for the layer.
QList< QgsServerMetadataUrlProperties::MetadataUrl > metadataUrls() const
Returns a list of metadataUrl resources associated for the layer.
void copyTo(QgsServerMetadataUrlProperties *properties) const
Copy properties to another instance.
void readXml(const QDomNode &layerNode)
Reads server properties from project file.
Manages QGIS Server properties for WMS dimensions.
void readXml(const QDomNode &layer_node)
Reads server properties from project file.
static QMap< int, QString > wmsDimensionDefaultDisplayLabels()
Returns WMS Dimension default display labels.
void writeXml(QDomNode &layer_node, QDomDocument &document) const
Saves server properties to xml under the layer node.
void reset()
Reset properties to default.
bool addWmsDimension(const QgsServerWmsDimensionProperties::WmsDimensionInfo &wmsDimInfo)
Adds a QGIS Server WMS Dimension.
void copyTo(QgsServerWmsDimensionProperties *properties) const
Copy properties to another instance.
bool removeWmsDimension(const QString &wmsDimName)
Removes a QGIS Server WMS Dimension.
const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > wmsDimensions() const
Returns the QGIS Server WMS Dimension list.
void setWmsDimensions(const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > &dimensions)
Set WMS Dimensions.
Represents a vector layer which manages a vector based dataset.
bool operator==(const QgsServerMetadataUrlProperties::MetadataUrl &other) const
Compare two MetadataUrl structure.
QString format
Format specification of online resource.
Setting to define QGIS Server WMS Dimension.
@ MaxValue
Modify current selection to include only select features which match.