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