QGIS API Documentation 4.3.0-Master (01f22706ec5)
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
191 if ( !layer() || layer()->type() != Qgis::LayerType::Vector )
192 return;
193
194 const QgsFields fields = static_cast<const QgsVectorLayer *>( layer() )->fields();
195 // QGIS Server WMS Dimensions
196 const QDomNode wmsDimsNode = layer_node.namedItem( u"wmsDimensions"_s );
197 if ( wmsDimsNode.isNull() )
198 {
199 return;
200 }
201 const QDomElement wmsDimsElem = wmsDimsNode.toElement();
202 const QDomNodeList wmsDimsList = wmsDimsElem.elementsByTagName( u"dimension"_s );
203 for ( int i = 0; i < wmsDimsList.size(); ++i )
204 {
205 const QDomElement dimElem = wmsDimsList.at( i ).toElement();
206 const QString dimName = dimElem.attribute( u"name"_s );
207 const QString dimFieldName = dimElem.attribute( u"fieldName"_s );
208 // check field name
209 const int dimFieldNameIndex = fields.indexOf( dimFieldName );
210 if ( dimFieldNameIndex == -1 )
211 {
212 continue;
213 }
214 QVariant dimRefValue;
215 const Qgis::WmsDimensionDefaultDisplay dimDefaultDisplayType = static_cast<Qgis::WmsDimensionDefaultDisplay>( dimElem.attribute( u"defaultDisplayType"_s ).toInt() );
216 if ( dimDefaultDisplayType == Qgis::WmsDimensionDefaultDisplay::ReferenceValue )
217 {
218 const QString dimRefValueStr = dimElem.attribute( u"referenceValue"_s );
219 if ( !dimRefValueStr.isEmpty() )
220 {
221 const QgsField dimField = fields.at( dimFieldNameIndex );
222 dimRefValue = QVariant( dimRefValueStr );
223 if ( !dimField.convertCompatible( dimRefValue ) )
224 {
225 continue;
226 }
227 }
228 }
230 dim( dimName, dimFieldName, dimElem.attribute( u"endFieldName"_s ), dimElem.attribute( u"units"_s ), dimElem.attribute( u"unitSymbol"_s ), dimDefaultDisplayType, dimRefValue );
231 //XXX This add O(n^2) complexity !!!!
232 // addWmsDimension( dim );
233 // Better to trust the XML:
234 mWmsDimensions.append( dim );
235 }
236}
237
238void QgsServerWmsDimensionProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
239{
240 // save QGIS Server WMS Dimension definitions
241 if ( !mWmsDimensions.isEmpty() )
242 {
243 QDomElement wmsDimsElem = document.createElement( u"wmsDimensions"_s );
244 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : mWmsDimensions )
245 {
246 QDomElement dimElem = document.createElement( u"dimension"_s );
247 dimElem.setAttribute( u"name"_s, dim.name );
248 dimElem.setAttribute( u"fieldName"_s, dim.fieldName );
249 dimElem.setAttribute( u"endFieldName"_s, dim.endFieldName );
250 dimElem.setAttribute( u"units"_s, dim.units );
251 dimElem.setAttribute( u"unitSymbol"_s, dim.unitSymbol );
252 dimElem.setAttribute( u"defaultDisplayType"_s, static_cast<int>( dim.defaultDisplayType ) );
253 dimElem.setAttribute( u"referenceValue"_s, dim.referenceValue().toString() );
254 wmsDimsElem.appendChild( dimElem );
255 }
256 layer_node.appendChild( wmsDimsElem );
257 }
258}
259
260
261// QgsMapLayerServerProperties
262
266
268{
271
272 properties->setShortName( mShortName );
273 properties->setTitle( mTitle );
274 properties->setWfsTitle( mWfsTitle );
275 properties->setAbstract( mAbstract );
276 properties->setKeywordList( mKeywordList );
277 properties->setDataUrl( mDataUrl );
278 properties->setDataUrlFormat( mDataUrlFormat );
279 properties->setAttribution( mAttribution );
280 properties->setAttributionUrl( mAttributionUrl );
281 properties->setLegendUrl( mLegendUrl );
282 properties->setLegendUrlFormat( mLegendUrlFormat );
283}
284
286{
289 && mShortName == other.mShortName
290 && mTitle == other.mTitle
291 && mWfsTitle == other.mWfsTitle
292 && mAbstract == other.mAbstract
293 && mKeywordList == other.mKeywordList
294 && mDataUrl == other.mDataUrl
295 && mDataUrlFormat == other.mDataUrlFormat
296 && mAttribution == other.mAttribution
297 && mAttributionUrl == other.mAttributionUrl
298 && mLegendUrl == other.mLegendUrl
299 && mLegendUrlFormat == other.mLegendUrlFormat;
300}
301
303{
304 return !( *this == other );
305}
306
312
314{
315 QString name = mLayer ? mLayer->name() : QString();
316 if ( !mShortName.isEmpty() )
317 name = mShortName;
318
319 name.replace( ' ', '_' ).replace( ':', '-' ).replace( QChar( 0x2014 ) /* em-dash */, '-' );
320
321 return name.toLocal8Bit();
322}
323
324void QgsMapLayerServerProperties::readXml( const QDomNode &layerNode ) // cppcheck-suppress duplInheritedMember
325{
327 if ( metadataUrls().isEmpty() )
328 {
329 // metadataUrl is still empty, maybe it's a QGIS Project < 3.22
330 // keep for legacy
331 const QDomElement metaUrlElem = layerNode.firstChildElement( u"metadataUrl"_s );
332 if ( !metaUrlElem.isNull() )
333 {
334 const QString url = metaUrlElem.text();
335 const QString type = metaUrlElem.attribute( u"type"_s, QString() );
336 const QString format = metaUrlElem.attribute( u"format"_s, QString() );
337 const QgsMapLayerServerProperties::MetadataUrl newItem( url, type, format );
338 setMetadataUrls( QList<QgsMapLayerServerProperties::MetadataUrl>() << newItem );
339 }
340 }
341
343
344 //short name
345 const QDomElement shortNameElem = layerNode.firstChildElement( u"shortname"_s );
346 if ( !shortNameElem.isNull() )
347 {
348 mShortName = shortNameElem.text();
349 }
350
351 //title
352 const QDomElement titleElem = layerNode.firstChildElement( u"title"_s );
353 if ( !titleElem.isNull() )
354 {
355 mTitle = titleElem.text();
356 mWfsTitle = titleElem.attribute( u"wfs"_s );
357 }
358
359 //abstract
360 const QDomElement abstractElem = layerNode.firstChildElement( u"abstract"_s );
361 if ( !abstractElem.isNull() )
362 {
363 mAbstract = abstractElem.text();
364 }
365
366 //keywordList
367 const QDomElement keywordListElem = layerNode.firstChildElement( u"keywordList"_s );
368 if ( !keywordListElem.isNull() )
369 {
370 QStringList kwdList;
371 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
372 {
373 const QString keyword = n.toElement().text();
374 if ( !keyword.isEmpty() )
375 kwdList << keyword;
376 }
377 mKeywordList = kwdList.join( ", "_L1 );
378 }
379
380 //dataUrl
381 const QDomElement dataUrlElem = layerNode.firstChildElement( u"dataUrl"_s );
382 if ( !dataUrlElem.isNull() )
383 {
384 mDataUrl = dataUrlElem.text();
385 mDataUrlFormat = dataUrlElem.attribute( u"format"_s, QString() );
386 }
387
388 //attribution
389 const QDomElement attribElem = layerNode.firstChildElement( u"attribution"_s );
390 if ( !attribElem.isNull() )
391 {
392 mAttribution = attribElem.text();
393 mAttributionUrl = attribElem.attribute( u"href"_s, QString() );
394 }
395
396 //legendUrl
397 const QDomElement legendUrlElem = layerNode.firstChildElement( u"legendUrl"_s );
398 if ( !legendUrlElem.isNull() )
399 {
400 mLegendUrl = legendUrlElem.text();
401 mLegendUrlFormat = legendUrlElem.attribute( u"format"_s, QString() );
402 }
403}
404
405void QgsMapLayerServerProperties::writeXml( QDomNode &layerNode, QDomDocument &document ) const // cppcheck-suppress duplInheritedMember
406{
407 QgsServerMetadataUrlProperties::writeXml( layerNode, document );
408 QgsServerWmsDimensionProperties::writeXml( layerNode, document );
409
410 // layer short name
411 if ( !mShortName.isEmpty() )
412 {
413 QDomElement layerShortName = document.createElement( u"shortname"_s );
414 const QDomText layerShortNameText = document.createTextNode( mShortName );
415 layerShortName.appendChild( layerShortNameText );
416 layerNode.appendChild( layerShortName );
417 }
418
419 // layer title
420 if ( !mTitle.isEmpty() )
421 {
422 QDomElement layerTitle = document.createElement( u"title"_s );
423 const QDomText layerTitleText = document.createTextNode( mTitle );
424 layerTitle.appendChild( layerTitleText );
425
426 if ( mTitle != mWfsTitle )
427 {
428 layerTitle.setAttribute( "wfs", mWfsTitle );
429 }
430
431 layerNode.appendChild( layerTitle );
432 }
433
434 // layer abstract
435 if ( !mAbstract.isEmpty() )
436 {
437 QDomElement layerAbstract = document.createElement( u"abstract"_s );
438 const QDomText layerAbstractText = document.createTextNode( mAbstract );
439 layerAbstract.appendChild( layerAbstractText );
440 layerNode.appendChild( layerAbstract );
441 }
442
443 // layer keyword list
444 const QStringList keywordStringList = mKeywordList.split( ',', Qt::SkipEmptyParts );
445 if ( !keywordStringList.isEmpty() )
446 {
447 QDomElement layerKeywordList = document.createElement( u"keywordList"_s );
448 for ( int i = 0; i < keywordStringList.size(); ++i )
449 {
450 QDomElement layerKeywordValue = document.createElement( u"value"_s );
451 const QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
452 layerKeywordValue.appendChild( layerKeywordText );
453 layerKeywordList.appendChild( layerKeywordValue );
454 }
455 layerNode.appendChild( layerKeywordList );
456 }
457
458 // layer dataUrl
459 if ( !mDataUrl.isEmpty() )
460 {
461 QDomElement layerDataUrl = document.createElement( u"dataUrl"_s );
462 const QDomText layerDataUrlText = document.createTextNode( mDataUrl );
463 layerDataUrl.appendChild( layerDataUrlText );
464 layerDataUrl.setAttribute( u"format"_s, mDataUrlFormat );
465 layerNode.appendChild( layerDataUrl );
466 }
467
468 // layer legendUrl
469 if ( !mLegendUrl.isEmpty() )
470 {
471 QDomElement layerLegendUrl = document.createElement( u"legendUrl"_s );
472 const QDomText layerLegendUrlText = document.createTextNode( mLegendUrl );
473 layerLegendUrl.appendChild( layerLegendUrlText );
474 layerLegendUrl.setAttribute( u"format"_s, mLegendUrlFormat );
475 layerNode.appendChild( layerLegendUrl );
476 }
477
478 // layer attribution
479 if ( !mAttribution.isEmpty() )
480 {
481 QDomElement layerAttribution = document.createElement( u"attribution"_s );
482 const QDomText layerAttributionText = document.createTextNode( mAttribution );
483 layerAttribution.appendChild( layerAttributionText );
484 layerAttribution.setAttribute( u"href"_s, mAttributionUrl );
485 layerNode.appendChild( layerAttribution );
486 }
487}
@ Vector
Vector layer.
Definition qgis.h:207
WmsDimensionDefaultDisplay
QGIS Server WMS Dimension default display types.
Definition qgis.h:7030
@ MinValue
Display minimum value of the dimension.
Definition qgis.h:7032
@ AllValues
Display all values of the dimension.
Definition qgis.h:7031
@ MaxValue
Display maximum value of the dimension.
Definition qgis.h:7033
@ ReferenceValue
Display a reference value.
Definition qgis.h:7034
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
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.