QGIS API Documentation 4.3.0-Master (0cfde48c85b)
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 && type == other.type && format == other.format;
35}
36
38{
39 return mMetadataUrls == other.mMetadataUrls;
40}
41
43{
44 return !( *this == other );
45}
46
48{
49 return name == other.name
50 && fieldName == other.fieldName
51 && endFieldName == other.endFieldName
52 && units == other.units
53 && unitSymbol == other.unitSymbol
55 && mReferenceValue == other.mReferenceValue;
56}
57
59{
60 return !( *this == other );
61}
62
67
69{
70 mMetadataUrls.clear();
71}
72
73void QgsServerMetadataUrlProperties::readXml( const QDomNode &layer_node )
74{
75 QDomElement element = layer_node.namedItem( u"metadataUrls"_s ).toElement();
76 mMetadataUrls.clear();
77 const QDomNodeList el = element.elementsByTagName( u"metadataUrl"_s );
78 for ( int i = 0; i < el.size(); i++ )
79 {
80 element = el.at( i ).toElement();
82 oneUrl.type = element.attribute( u"type"_s );
83 oneUrl.format = element.attribute( u"format"_s );
84 oneUrl.url = element.text();
85 addMetadataUrl( oneUrl );
86 }
87}
88
89void QgsServerMetadataUrlProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
90{
91 if ( !mMetadataUrls.empty() )
92 {
93 QDomElement urls = document.createElement( u"metadataUrls"_s );
94 for ( const QgsMapLayerServerProperties::MetadataUrl &url : mMetadataUrls )
95 {
96 QDomElement urlElement = document.createElement( u"metadataUrl"_s );
97 urlElement.setAttribute( u"type"_s, url.type );
98 urlElement.setAttribute( u"format"_s, url.format );
99 urlElement.appendChild( document.createTextNode( url.url ) );
100 urls.appendChild( urlElement );
101 }
102 layer_node.appendChild( urls );
103 }
104}
105
106// QgsServerWmsDimensionProperties
107
109{
110 return mWmsDimensions == other.mWmsDimensions;
111}
112
114{
115 return !( *this == other );
116}
117
122
124{
125 mWmsDimensions.clear();
126}
127
128void QgsServerWmsDimensionProperties::setWmsDimensions( const QList<QgsServerWmsDimensionProperties::WmsDimensionInfo> &dimensions )
129{
130 mWmsDimensions = dimensions;
131}
132
134{
135 QMap<int, QString> labels;
136 const QMap<Qgis::WmsDimensionDefaultDisplay, QString> descriptions = wmsDimensionDefaultDisplayDescriptions();
137 for ( auto it = descriptions.cbegin(); it != descriptions.cend(); it++ )
138 {
139 labels[static_cast<int>( it.key() )] = descriptions[it.key()];
140 }
141
142 return labels;
143}
144
145QMap<Qgis::WmsDimensionDefaultDisplay, QString> QgsServerWmsDimensionProperties::wmsDimensionDefaultDisplayDescriptions()
146{
147 QMap<Qgis::WmsDimensionDefaultDisplay, QString> labels;
148 labels[Qgis::WmsDimensionDefaultDisplay::AllValues] = QObject::tr( "All Values" );
149 labels[Qgis::WmsDimensionDefaultDisplay::MinValue] = QObject::tr( "Minimum Value" );
150 labels[Qgis::WmsDimensionDefaultDisplay::MaxValue] = QObject::tr( "Maximum Value" );
151 labels[Qgis::WmsDimensionDefaultDisplay::ReferenceValue] = QObject::tr( "Reference Value" );
152 return labels;
153}
154
156{
157 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : std::as_const( mWmsDimensions ) )
158 {
159 if ( dim.name == wmsDimInfo.name )
160 {
161 return false;
162 }
163 }
164 mWmsDimensions.append( wmsDimInfo );
165 return true;
166}
167
169{
170 for ( int i = 0; i < mWmsDimensions.size(); ++i )
171 {
172 if ( mWmsDimensions[i].name == wmsDimName )
173 {
174 mWmsDimensions.removeAt( i );
175 return true;
176 }
177 }
178 return false;
179}
180
181const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > QgsServerWmsDimensionProperties::wmsDimensions() const
182{
183 return mWmsDimensions;
184}
185
186void QgsServerWmsDimensionProperties::readXml( const QDomNode &layer_node )
187{
188 reset();
189
190 // Apply only for vector layers and layer tree group
191 if ( layer() && layer()->type() != Qgis::LayerType::Vector )
192 return;
193
194 const QgsVectorLayer *vl = qobject_cast<const QgsVectorLayer *>( layer() );
195
196 // QGIS Server WMS Dimensions
197 const QDomNode wmsDimsNode = layer_node.namedItem( u"wmsDimensions"_s );
198 if ( wmsDimsNode.isNull() )
199 {
200 return;
201 }
202 const QDomElement wmsDimsElem = wmsDimsNode.toElement();
203 const QDomNodeList wmsDimsList = wmsDimsElem.elementsByTagName( u"dimension"_s );
204 for ( int i = 0; i < wmsDimsList.size(); ++i )
205 {
206 const QDomElement dimElem = wmsDimsList.at( i ).toElement();
207 const QString dimName = dimElem.attribute( u"name"_s );
208 const QString dimFieldName = dimElem.attribute( u"fieldName"_s );
209 const Qgis::WmsDimensionDefaultDisplay dimDefaultDisplayType = static_cast<Qgis::WmsDimensionDefaultDisplay>( dimElem.attribute( u"defaultDisplayType"_s ).toInt() );
210 const QString dimRefValueStr = dimElem.attribute( u"referenceValue"_s );
211
212 QVariant dimRefValue;
213 if ( vl )
214 {
215 // check field name
216 const QgsFields fields = vl->fields();
217 const int dimFieldNameIndex = fields.indexOf( dimFieldName );
218 if ( dimFieldNameIndex == -1 )
219 continue;
220
221 if ( !dimRefValueStr.isEmpty() )
222 {
223 const QgsField dimField = fields.at( dimFieldNameIndex );
224 dimRefValue = QVariant( dimRefValueStr );
225 if ( !dimField.convertCompatible( dimRefValue ) )
226 continue;
227 }
228 }
229 // layer tree group
231 {
232 dimRefValue = QDateTime::fromString( dimRefValueStr, Qt::ISODate );
233 }
234
236 dim( dimName, dimFieldName, dimElem.attribute( u"endFieldName"_s ), dimElem.attribute( u"units"_s ), dimElem.attribute( u"unitSymbol"_s ), dimDefaultDisplayType, dimRefValue );
237 //XXX This add O(n^2) complexity !!!!
238 // addWmsDimension( dim );
239 // Better to trust the XML:
240 mWmsDimensions.append( dim );
241 }
242}
243
244void QgsServerWmsDimensionProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
245{
246 // save QGIS Server WMS Dimension definitions
247 if ( !mWmsDimensions.isEmpty() )
248 {
249 QDomElement wmsDimsElem = document.createElement( u"wmsDimensions"_s );
250 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : mWmsDimensions )
251 {
252 QDomElement dimElem = document.createElement( u"dimension"_s );
253 dimElem.setAttribute( u"name"_s, dim.name );
254
255 if ( !dim.fieldName.isEmpty() )
256 dimElem.setAttribute( u"fieldName"_s, dim.fieldName );
257
258 if ( !dim.endFieldName.isEmpty() )
259 dimElem.setAttribute( u"endFieldName"_s, dim.endFieldName );
260
261 if ( !dim.units.isEmpty() )
262 dimElem.setAttribute( u"units"_s, dim.units );
263
264 if ( !dim.unitSymbol.isEmpty() )
265 dimElem.setAttribute( u"unitSymbol"_s, dim.unitSymbol );
266
267 dimElem.setAttribute( u"defaultDisplayType"_s, static_cast<int>( dim.defaultDisplayType ) );
268
269 if ( !dim.referenceValue().isNull() )
270 dimElem.setAttribute( u"referenceValue"_s, dim.referenceValue().toString() );
271
272 wmsDimsElem.appendChild( dimElem );
273 }
274 layer_node.appendChild( wmsDimsElem );
275 }
276}
277
278
279// QgsMapLayerServerProperties
280
284
286{
289
290 properties->setShortName( mShortName );
291 properties->setTitle( mTitle );
292 properties->setWfsTitle( mWfsTitle );
293 properties->setAbstract( mAbstract );
294 properties->setKeywordList( mKeywordList );
295 properties->setDataUrl( mDataUrl );
296 properties->setDataUrlFormat( mDataUrlFormat );
297 properties->setAttribution( mAttribution );
298 properties->setAttributionUrl( mAttributionUrl );
299 properties->setLegendUrl( mLegendUrl );
300 properties->setLegendUrlFormat( mLegendUrlFormat );
301}
302
304{
307 && mShortName == other.mShortName
308 && mTitle == other.mTitle
309 && mWfsTitle == other.mWfsTitle
310 && mAbstract == other.mAbstract
311 && mKeywordList == other.mKeywordList
312 && mDataUrl == other.mDataUrl
313 && mDataUrlFormat == other.mDataUrlFormat
314 && mAttribution == other.mAttribution
315 && mAttributionUrl == other.mAttributionUrl
316 && mLegendUrl == other.mLegendUrl
317 && mLegendUrlFormat == other.mLegendUrlFormat;
318}
319
321{
322 return !( *this == other );
323}
324
330
332{
333 QString name = mLayer ? mLayer->name() : QString();
334 if ( !mShortName.isEmpty() )
335 name = mShortName;
336
337 name.replace( ' ', '_' ).replace( ':', '-' ).replace( QChar( 0x2014 ) /* em-dash */, '-' );
338
339 return name.toLocal8Bit();
340}
341
342void QgsMapLayerServerProperties::readXml( const QDomNode &layerNode ) // cppcheck-suppress duplInheritedMember
343{
345 if ( metadataUrls().isEmpty() )
346 {
347 // metadataUrl is still empty, maybe it's a QGIS Project < 3.22
348 // keep for legacy
349 const QDomElement metaUrlElem = layerNode.firstChildElement( u"metadataUrl"_s );
350 if ( !metaUrlElem.isNull() )
351 {
352 const QString url = metaUrlElem.text();
353 const QString type = metaUrlElem.attribute( u"type"_s, QString() );
354 const QString format = metaUrlElem.attribute( u"format"_s, QString() );
355 const QgsMapLayerServerProperties::MetadataUrl newItem( url, type, format );
356 setMetadataUrls( QList<QgsMapLayerServerProperties::MetadataUrl>() << newItem );
357 }
358 }
359
361
362 //short name
363 const QDomElement shortNameElem = layerNode.firstChildElement( u"shortname"_s );
364 if ( !shortNameElem.isNull() )
365 {
366 mShortName = shortNameElem.text();
367 }
368
369 //title
370 const QDomElement titleElem = layerNode.firstChildElement( u"title"_s );
371 if ( !titleElem.isNull() )
372 {
373 mTitle = titleElem.text();
374 mWfsTitle = titleElem.attribute( u"wfs"_s );
375 }
376
377 //abstract
378 const QDomElement abstractElem = layerNode.firstChildElement( u"abstract"_s );
379 if ( !abstractElem.isNull() )
380 {
381 mAbstract = abstractElem.text();
382 }
383
384 //keywordList
385 const QDomElement keywordListElem = layerNode.firstChildElement( u"keywordList"_s );
386 if ( !keywordListElem.isNull() )
387 {
388 QStringList kwdList;
389 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
390 {
391 const QString keyword = n.toElement().text();
392 if ( !keyword.isEmpty() )
393 kwdList << keyword;
394 }
395 mKeywordList = kwdList.join( ", "_L1 );
396 }
397
398 //dataUrl
399 const QDomElement dataUrlElem = layerNode.firstChildElement( u"dataUrl"_s );
400 if ( !dataUrlElem.isNull() )
401 {
402 mDataUrl = dataUrlElem.text();
403 mDataUrlFormat = dataUrlElem.attribute( u"format"_s, QString() );
404 }
405
406 //attribution
407 const QDomElement attribElem = layerNode.firstChildElement( u"attribution"_s );
408 if ( !attribElem.isNull() )
409 {
410 mAttribution = attribElem.text();
411 mAttributionUrl = attribElem.attribute( u"href"_s, QString() );
412 }
413
414 //legendUrl
415 const QDomElement legendUrlElem = layerNode.firstChildElement( u"legendUrl"_s );
416 if ( !legendUrlElem.isNull() )
417 {
418 mLegendUrl = legendUrlElem.text();
419 mLegendUrlFormat = legendUrlElem.attribute( u"format"_s, QString() );
420 }
421}
422
423void QgsMapLayerServerProperties::writeXml( QDomNode &layerNode, QDomDocument &document ) const // cppcheck-suppress duplInheritedMember
424{
425 QgsServerMetadataUrlProperties::writeXml( layerNode, document );
426 QgsServerWmsDimensionProperties::writeXml( layerNode, document );
427
428 // layer short name
429 if ( !mShortName.isEmpty() )
430 {
431 QDomElement layerShortName = document.createElement( u"shortname"_s );
432 const QDomText layerShortNameText = document.createTextNode( mShortName );
433 layerShortName.appendChild( layerShortNameText );
434 layerNode.appendChild( layerShortName );
435 }
436
437 // layer title
438 if ( !mTitle.isEmpty() )
439 {
440 QDomElement layerTitle = document.createElement( u"title"_s );
441 const QDomText layerTitleText = document.createTextNode( mTitle );
442 layerTitle.appendChild( layerTitleText );
443
444 if ( mTitle != mWfsTitle )
445 {
446 layerTitle.setAttribute( "wfs", mWfsTitle );
447 }
448
449 layerNode.appendChild( layerTitle );
450 }
451
452 // layer abstract
453 if ( !mAbstract.isEmpty() )
454 {
455 QDomElement layerAbstract = document.createElement( u"abstract"_s );
456 const QDomText layerAbstractText = document.createTextNode( mAbstract );
457 layerAbstract.appendChild( layerAbstractText );
458 layerNode.appendChild( layerAbstract );
459 }
460
461 // layer keyword list
462 const QStringList keywordStringList = mKeywordList.split( ',', Qt::SkipEmptyParts );
463 if ( !keywordStringList.isEmpty() )
464 {
465 QDomElement layerKeywordList = document.createElement( u"keywordList"_s );
466 for ( int i = 0; i < keywordStringList.size(); ++i )
467 {
468 QDomElement layerKeywordValue = document.createElement( u"value"_s );
469 const QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
470 layerKeywordValue.appendChild( layerKeywordText );
471 layerKeywordList.appendChild( layerKeywordValue );
472 }
473 layerNode.appendChild( layerKeywordList );
474 }
475
476 // layer dataUrl
477 if ( !mDataUrl.isEmpty() )
478 {
479 QDomElement layerDataUrl = document.createElement( u"dataUrl"_s );
480 const QDomText layerDataUrlText = document.createTextNode( mDataUrl );
481 layerDataUrl.appendChild( layerDataUrlText );
482 layerDataUrl.setAttribute( u"format"_s, mDataUrlFormat );
483 layerNode.appendChild( layerDataUrl );
484 }
485
486 // layer legendUrl
487 if ( !mLegendUrl.isEmpty() )
488 {
489 QDomElement layerLegendUrl = document.createElement( u"legendUrl"_s );
490 const QDomText layerLegendUrlText = document.createTextNode( mLegendUrl );
491 layerLegendUrl.appendChild( layerLegendUrlText );
492 layerLegendUrl.setAttribute( u"format"_s, mLegendUrlFormat );
493 layerNode.appendChild( layerLegendUrl );
494 }
495
496 // layer attribution
497 if ( !mAttribution.isEmpty() )
498 {
499 QDomElement layerAttribution = document.createElement( u"attribution"_s );
500 const QDomText layerAttributionText = document.createTextNode( mAttribution );
501 layerAttribution.appendChild( layerAttributionText );
502 layerAttribution.setAttribute( u"href"_s, mAttributionUrl );
503 layerNode.appendChild( layerAttribution );
504 }
505}
@ Vector
Vector layer.
Definition qgis.h:207
WmsDimensionDefaultDisplay
QGIS Server WMS Dimension default display types.
Definition qgis.h:7152
@ MinValue
Display minimum value of the dimension.
Definition qgis.h:7154
@ AllValues
Display all values of the dimension.
Definition qgis.h:7153
@ MaxValue
Display maximum value of the dimension.
Definition qgis.h:7155
@ ReferenceValue
Display a reference value.
Definition qgis.h:7156
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:485
Container of fields for a vector layer.
Definition qgsfields.h:45
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.
void setWfsTitle(const QString &title)
Sets the title of the layer used by QGIS Server in WFS GetCapabilities request.
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.
static QMap< Qgis::WmsDimensionDefaultDisplay, QString > wmsDimensionDefaultDisplayDescriptions()
Returns WMS Dimension default display descriptions.
bool operator==(const QgsServerWmsDimensionProperties &other) const
bool operator!=(const QgsServerWmsDimensionProperties &other) const
static constexpr const char * TIME_DIMENSION_NAME
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(), Qgis::WmsDimensionDefaultDisplay dimDefaultDisplayType=Qgis::WmsDimensionDefaultDisplay::AllValues, const QVariant &dimReferenceValue=QVariant())
Constructor for WmsDimensionInfo.