QGIS API Documentation 3.43.0-Master (c67cf405802)
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
35{
36 return mMetadataUrls == other.mMetadataUrls;
37}
38
40{
41 return !( *this == other );
42}
43
45{
46 return name == other.name
47 && fieldName == other.fieldName
48 && endFieldName == other.endFieldName
49 && units == other.units
50 && unitSymbol == other.unitSymbol
51 && defaultDisplayType == other.defaultDisplayType
52 && referenceValue == other.referenceValue;
53}
54
56{
57 return !( *this == other );
58}
59
64
66{
67 mMetadataUrls.clear();
68}
69
70void QgsServerMetadataUrlProperties::readXml( const QDomNode &layer_node )
71{
72 QDomElement element = layer_node.namedItem( QStringLiteral( "metadataUrls" ) ).toElement();
73 mMetadataUrls.clear();
74 const QDomNodeList el = element.elementsByTagName( QStringLiteral( "metadataUrl" ) );
75 for ( int i = 0; i < el.size(); i++ )
76 {
77 element = el.at( i ).toElement();
79 oneUrl.type = element.attribute( QStringLiteral( "type" ) );
80 oneUrl.format = element.attribute( QStringLiteral( "format" ) );
81 oneUrl.url = element.text();
82 addMetadataUrl( oneUrl );
83 }
84}
85
86void QgsServerMetadataUrlProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
87{
88 if ( !mMetadataUrls.empty() )
89 {
90 QDomElement urls = document.createElement( QStringLiteral( "metadataUrls" ) );
91 for ( const QgsMapLayerServerProperties::MetadataUrl &url : mMetadataUrls )
92 {
93 QDomElement urlElement = document.createElement( QStringLiteral( "metadataUrl" ) );
94 urlElement.setAttribute( QStringLiteral( "type" ), url.type );
95 urlElement.setAttribute( QStringLiteral( "format" ), url.format );
96 urlElement.appendChild( document.createTextNode( url.url ) );
97 urls.appendChild( urlElement );
98 }
99 layer_node.appendChild( urls );
100 }
101}
102
103// QgsServerWmsDimensionProperties
104
106{
107 return mWmsDimensions == other.mWmsDimensions;
108}
109
111{
112 return !( *this == other );
113}
114
116{
117 properties->setWmsDimensions( wmsDimensions() );
118}
119
121{
122 mWmsDimensions.clear();
123}
124
125void QgsServerWmsDimensionProperties::setWmsDimensions( const QList<QgsServerWmsDimensionProperties::WmsDimensionInfo> &dimensions )
126{
127 mWmsDimensions = dimensions;
128}
129
131{
132 QMap<int, QString> labels;
133 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::AllValues] = QObject::tr( "All values" );
134 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::MinValue] = QObject::tr( "Min value" );
135 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::MaxValue] = QObject::tr( "Max value" );
136 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::ReferenceValue] = QObject::tr( "Reference value" );
137 return labels;
138}
139
141{
142 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : std::as_const( mWmsDimensions ) )
143 {
144 if ( dim.name == wmsDimInfo.name )
145 {
146 return false;
147 }
148 }
149 mWmsDimensions.append( wmsDimInfo );
150 return true;
151}
152
154{
155 for ( int i = 0; i < mWmsDimensions.size(); ++i )
156 {
157 if ( mWmsDimensions[ i ].name == wmsDimName )
158 {
159 mWmsDimensions.removeAt( i );
160 return true;
161 }
162 }
163 return false;
164}
165
166const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > QgsServerWmsDimensionProperties::wmsDimensions() const
167{
168 return mWmsDimensions;
169}
170
171void QgsServerWmsDimensionProperties::readXml( const QDomNode &layer_node )
172{
173 reset();
174
175 // Apply only for vector layers
176 if ( !layer() || layer()->type() != Qgis::LayerType::Vector )
177 return;
178
179 const QgsFields fields = static_cast<const QgsVectorLayer *>( layer() )->fields();
180 // QGIS Server WMS Dimensions
181 const QDomNode wmsDimsNode = layer_node.namedItem( QStringLiteral( "wmsDimensions" ) );
182 if ( wmsDimsNode.isNull() )
183 {
184 return;
185 }
186 const QDomElement wmsDimsElem = wmsDimsNode.toElement();
187 const QDomNodeList wmsDimsList = wmsDimsElem.elementsByTagName( QStringLiteral( "dimension" ) );
188 for ( int i = 0; i < wmsDimsList.size(); ++i )
189 {
190 const QDomElement dimElem = wmsDimsList.at( i ).toElement();
191 const QString dimName = dimElem.attribute( QStringLiteral( "name" ) );
192 const QString dimFieldName = dimElem.attribute( QStringLiteral( "fieldName" ) );
193 // check field name
194 const int dimFieldNameIndex = fields.indexOf( dimFieldName );
195 if ( dimFieldNameIndex == -1 )
196 {
197 continue;
198 }
199 QVariant dimRefValue;
200 const int dimDefaultDisplayType = dimElem.attribute( QStringLiteral( "defaultDisplayType" ) ).toInt();
202 {
203 const QString dimRefValueStr = dimElem.attribute( QStringLiteral( "referenceValue" ) );
204 if ( !dimRefValueStr.isEmpty() )
205 {
206 const QgsField dimField = fields.at( dimFieldNameIndex );
207 dimRefValue = QVariant( dimRefValueStr );
208 if ( !dimField.convertCompatible( dimRefValue ) )
209 {
210 continue;
211 }
212 }
213 }
214 QgsServerWmsDimensionProperties::WmsDimensionInfo dim( dimName, dimFieldName,
215 dimElem.attribute( QStringLiteral( "endFieldName" ) ),
216 dimElem.attribute( QStringLiteral( "units" ) ),
217 dimElem.attribute( QStringLiteral( "unitSymbol" ) ),
218 dimDefaultDisplayType, dimRefValue );
219 //XXX This add O(n^2) complexity !!!!
220 // addWmsDimension( dim );
221 // Better to trust the XML:
222 mWmsDimensions.append( dim );
223 }
224}
225
226void QgsServerWmsDimensionProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
227{
228 // save QGIS Server WMS Dimension definitions
229 if ( ! mWmsDimensions.isEmpty() )
230 {
231 QDomElement wmsDimsElem = document.createElement( QStringLiteral( "wmsDimensions" ) );
232 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : mWmsDimensions )
233 {
234 QDomElement dimElem = document.createElement( QStringLiteral( "dimension" ) );
235 dimElem.setAttribute( QStringLiteral( "name" ), dim.name );
236 dimElem.setAttribute( QStringLiteral( "fieldName" ), dim.fieldName );
237 dimElem.setAttribute( QStringLiteral( "endFieldName" ), dim.endFieldName );
238 dimElem.setAttribute( QStringLiteral( "units" ), dim.units );
239 dimElem.setAttribute( QStringLiteral( "unitSymbol" ), dim.unitSymbol );
240 dimElem.setAttribute( QStringLiteral( "defaultDisplayType" ), dim.defaultDisplayType );
241 dimElem.setAttribute( QStringLiteral( "referenceValue" ), dim.referenceValue.toString() );
242 wmsDimsElem.appendChild( dimElem );
243 }
244 layer_node.appendChild( wmsDimsElem );
245 }
246}
247
248
249// QgsMapLayerServerProperties
250
255
257{
260
261 properties->setShortName( mShortName );
262 properties->setTitle( mTitle );
263 properties->setAbstract( mAbstract );
264 properties->setKeywordList( mKeywordList );
265 properties->setDataUrl( mDataUrl );
266 properties->setDataUrlFormat( mDataUrlFormat );
267 properties->setAttribution( mAttribution );
268 properties->setAttributionUrl( mAttributionUrl );
269 properties->setLegendUrl( mLegendUrl );
270 properties->setLegendUrlFormat( mLegendUrlFormat );
271}
272
274{
277 && mShortName == other.mShortName
278 && mTitle == other.mTitle
279 && mAbstract == other.mAbstract
280 && mKeywordList == other.mKeywordList
281 && mDataUrl == other.mDataUrl
282 && mDataUrlFormat == other.mDataUrlFormat
283 && mAttribution == other.mAttribution
284 && mAttributionUrl == other.mAttributionUrl
285 && mLegendUrl == other.mLegendUrl
286 && mLegendUrlFormat == other.mLegendUrlFormat;
287}
288
290{
291 return !( *this == other );
292}
293
299
300void QgsMapLayerServerProperties::readXml( const QDomNode &layerNode ) // cppcheck-suppress duplInheritedMember
301{
303 if ( metadataUrls().isEmpty() )
304 {
305 // metadataUrl is still empty, maybe it's a QGIS Project < 3.22
306 // keep for legacy
307 const QDomElement metaUrlElem = layerNode.firstChildElement( QStringLiteral( "metadataUrl" ) );
308 if ( !metaUrlElem.isNull() )
309 {
310 const QString url = metaUrlElem.text();
311 const QString type = metaUrlElem.attribute( QStringLiteral( "type" ), QString() );
312 const QString format = metaUrlElem.attribute( QStringLiteral( "format" ), QString() );
313 const QgsMapLayerServerProperties::MetadataUrl newItem( url, type, format );
314 setMetadataUrls( QList<QgsMapLayerServerProperties::MetadataUrl>() << newItem );
315 }
316 }
317
319
320 //short name
321 const QDomElement shortNameElem = layerNode.firstChildElement( QStringLiteral( "shortname" ) );
322 if ( !shortNameElem.isNull() )
323 {
324 mShortName = shortNameElem.text();
325 }
326
327 //title
328 const QDomElement titleElem = layerNode.firstChildElement( QStringLiteral( "title" ) );
329 if ( !titleElem.isNull() )
330 {
331 mTitle = titleElem.text();
332 mWfsTitle = titleElem.attribute( QStringLiteral( "wfs" ) );
333 }
334
335 //abstract
336 const QDomElement abstractElem = layerNode.firstChildElement( QStringLiteral( "abstract" ) );
337 if ( !abstractElem.isNull() )
338 {
339 mAbstract = abstractElem.text();
340 }
341
342 //keywordList
343 const QDomElement keywordListElem = layerNode.firstChildElement( QStringLiteral( "keywordList" ) );
344 if ( !keywordListElem.isNull() )
345 {
346 QStringList kwdList;
347 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
348 {
349 const QString keyword = n.toElement().text();
350 if ( !keyword.isEmpty() )
351 kwdList << keyword;
352 }
353 mKeywordList = kwdList.join( QLatin1String( ", " ) );
354 }
355
356 //dataUrl
357 const QDomElement dataUrlElem = layerNode.firstChildElement( QStringLiteral( "dataUrl" ) );
358 if ( !dataUrlElem.isNull() )
359 {
360 mDataUrl = dataUrlElem.text();
361 mDataUrlFormat = dataUrlElem.attribute( QStringLiteral( "format" ), QString() );
362 }
363
364 //attribution
365 const QDomElement attribElem = layerNode.firstChildElement( QStringLiteral( "attribution" ) );
366 if ( !attribElem.isNull() )
367 {
368 mAttribution = attribElem.text();
369 mAttributionUrl = attribElem.attribute( QStringLiteral( "href" ), QString() );
370 }
371
372 //legendUrl
373 const QDomElement legendUrlElem = layerNode.firstChildElement( QStringLiteral( "legendUrl" ) );
374 if ( !legendUrlElem.isNull() )
375 {
376 mLegendUrl = legendUrlElem.text();
377 mLegendUrlFormat = legendUrlElem.attribute( QStringLiteral( "format" ), QString() );
378 }
379}
380
381void QgsMapLayerServerProperties::writeXml( QDomNode &layerNode, QDomDocument &document ) const // cppcheck-suppress duplInheritedMember
382{
383 QgsServerMetadataUrlProperties::writeXml( layerNode, document );
384 QgsServerWmsDimensionProperties::writeXml( layerNode, document );
385
386 // layer short name
387 if ( !mShortName.isEmpty() )
388 {
389 QDomElement layerShortName = document.createElement( QStringLiteral( "shortname" ) );
390 const QDomText layerShortNameText = document.createTextNode( mShortName );
391 layerShortName.appendChild( layerShortNameText );
392 layerNode.appendChild( layerShortName );
393 }
394
395 // layer title
396 if ( !mTitle.isEmpty() )
397 {
398 QDomElement layerTitle = document.createElement( QStringLiteral( "title" ) );
399 const QDomText layerTitleText = document.createTextNode( mTitle );
400 layerTitle.appendChild( layerTitleText );
401
402 if ( mTitle != mWfsTitle )
403 {
404 layerTitle.setAttribute( "wfs", mWfsTitle );
405 }
406
407 layerNode.appendChild( layerTitle );
408 }
409
410 // layer abstract
411 if ( !mAbstract.isEmpty() )
412 {
413 QDomElement layerAbstract = document.createElement( QStringLiteral( "abstract" ) );
414 const QDomText layerAbstractText = document.createTextNode( mAbstract );
415 layerAbstract.appendChild( layerAbstractText );
416 layerNode.appendChild( layerAbstract );
417 }
418
419 // layer keyword list
420 const QStringList keywordStringList = mKeywordList.split( ',', Qt::SkipEmptyParts );
421 if ( !keywordStringList.isEmpty() )
422 {
423 QDomElement layerKeywordList = document.createElement( QStringLiteral( "keywordList" ) );
424 for ( int i = 0; i < keywordStringList.size(); ++i )
425 {
426 QDomElement layerKeywordValue = document.createElement( QStringLiteral( "value" ) );
427 const QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
428 layerKeywordValue.appendChild( layerKeywordText );
429 layerKeywordList.appendChild( layerKeywordValue );
430 }
431 layerNode.appendChild( layerKeywordList );
432 }
433
434 // layer dataUrl
435 if ( !mDataUrl.isEmpty() )
436 {
437 QDomElement layerDataUrl = document.createElement( QStringLiteral( "dataUrl" ) );
438 const QDomText layerDataUrlText = document.createTextNode( mDataUrl );
439 layerDataUrl.appendChild( layerDataUrlText );
440 layerDataUrl.setAttribute( QStringLiteral( "format" ), mDataUrlFormat );
441 layerNode.appendChild( layerDataUrl );
442 }
443
444 // layer legendUrl
445 if ( !mLegendUrl.isEmpty() )
446 {
447 QDomElement layerLegendUrl = document.createElement( QStringLiteral( "legendUrl" ) );
448 const QDomText layerLegendUrlText = document.createTextNode( mLegendUrl );
449 layerLegendUrl.appendChild( layerLegendUrlText );
450 layerLegendUrl.setAttribute( QStringLiteral( "format" ), mLegendUrlFormat );
451 layerNode.appendChild( layerLegendUrl );
452 }
453
454 // layer attribution
455 if ( !mAttribution.isEmpty() )
456 {
457 QDomElement layerAttribution = document.createElement( QStringLiteral( "attribution" ) );
458 const QDomText layerAttributionText = document.createTextNode( mAttribution );
459 layerAttribution.appendChild( layerAttributionText );
460 layerAttribution.setAttribute( QStringLiteral( "href" ), mAttributionUrl );
461 layerNode.appendChild( layerAttribution );
462 }
463}
@ 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.
bool operator==(const QgsMapLayerServerProperties &other) const
QgsMapLayerServerProperties(QgsMapLayer *layer=nullptr)
Constructor - Creates a Map Layer QGIS Server Properties.
bool operator!=(const QgsMapLayerServerProperties &other) const
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.
bool operator==(const QgsServerMetadataUrlProperties &other) const
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.
bool operator!=(const QgsServerMetadataUrlProperties &other) const
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 operator==(const QgsServerWmsDimensionProperties &other) const
bool operator!=(const QgsServerWmsDimensionProperties &other) const
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.