QGIS API Documentation 4.3.0-Master (40e84817713)
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
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 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::AllValues] = QObject::tr( "All values" );
137 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::MinValue] = QObject::tr( "Min value" );
138 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::MaxValue] = QObject::tr( "Max value" );
139 labels[QgsServerWmsDimensionProperties::WmsDimensionInfo::ReferenceValue] = QObject::tr( "Reference value" );
140 return labels;
141}
142
144{
145 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : std::as_const( mWmsDimensions ) )
146 {
147 if ( dim.name == wmsDimInfo.name )
148 {
149 return false;
150 }
151 }
152 mWmsDimensions.append( wmsDimInfo );
153 return true;
154}
155
157{
158 for ( int i = 0; i < mWmsDimensions.size(); ++i )
159 {
160 if ( mWmsDimensions[i].name == wmsDimName )
161 {
162 mWmsDimensions.removeAt( i );
163 return true;
164 }
165 }
166 return false;
167}
168
169const QList< QgsServerWmsDimensionProperties::WmsDimensionInfo > QgsServerWmsDimensionProperties::wmsDimensions() const
170{
171 return mWmsDimensions;
172}
173
174void QgsServerWmsDimensionProperties::readXml( const QDomNode &layer_node )
175{
176 reset();
177
178 // Apply only for vector layers
179 if ( !layer() || layer()->type() != Qgis::LayerType::Vector )
180 return;
181
182 const QgsFields fields = static_cast<const QgsVectorLayer *>( layer() )->fields();
183 // QGIS Server WMS Dimensions
184 const QDomNode wmsDimsNode = layer_node.namedItem( u"wmsDimensions"_s );
185 if ( wmsDimsNode.isNull() )
186 {
187 return;
188 }
189 const QDomElement wmsDimsElem = wmsDimsNode.toElement();
190 const QDomNodeList wmsDimsList = wmsDimsElem.elementsByTagName( u"dimension"_s );
191 for ( int i = 0; i < wmsDimsList.size(); ++i )
192 {
193 const QDomElement dimElem = wmsDimsList.at( i ).toElement();
194 const QString dimName = dimElem.attribute( u"name"_s );
195 const QString dimFieldName = dimElem.attribute( u"fieldName"_s );
196 // check field name
197 const int dimFieldNameIndex = fields.indexOf( dimFieldName );
198 if ( dimFieldNameIndex == -1 )
199 {
200 continue;
201 }
202 QVariant dimRefValue;
203 const int dimDefaultDisplayType = dimElem.attribute( u"defaultDisplayType"_s ).toInt();
205 {
206 const QString dimRefValueStr = dimElem.attribute( u"referenceValue"_s );
207 if ( !dimRefValueStr.isEmpty() )
208 {
209 const QgsField dimField = fields.at( dimFieldNameIndex );
210 dimRefValue = QVariant( dimRefValueStr );
211 if ( !dimField.convertCompatible( dimRefValue ) )
212 {
213 continue;
214 }
215 }
216 }
218 dim( dimName, dimFieldName, dimElem.attribute( u"endFieldName"_s ), dimElem.attribute( u"units"_s ), dimElem.attribute( u"unitSymbol"_s ), 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( u"wmsDimensions"_s );
232 for ( const QgsServerWmsDimensionProperties::WmsDimensionInfo &dim : mWmsDimensions )
233 {
234 QDomElement dimElem = document.createElement( u"dimension"_s );
235 dimElem.setAttribute( u"name"_s, dim.name );
236 dimElem.setAttribute( u"fieldName"_s, dim.fieldName );
237 dimElem.setAttribute( u"endFieldName"_s, dim.endFieldName );
238 dimElem.setAttribute( u"units"_s, dim.units );
239 dimElem.setAttribute( u"unitSymbol"_s, dim.unitSymbol );
240 dimElem.setAttribute( u"defaultDisplayType"_s, dim.defaultDisplayType );
241 dimElem.setAttribute( u"referenceValue"_s, dim.referenceValue.toString() );
242 wmsDimsElem.appendChild( dimElem );
243 }
244 layer_node.appendChild( wmsDimsElem );
245 }
246}
247
248
249// QgsMapLayerServerProperties
250
254
256{
259
260 properties->setShortName( mShortName );
261 properties->setTitle( mTitle );
262 properties->setWfsTitle( mWfsTitle );
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 && mWfsTitle == other.mWfsTitle
280 && mAbstract == other.mAbstract
281 && mKeywordList == other.mKeywordList
282 && mDataUrl == other.mDataUrl
283 && mDataUrlFormat == other.mDataUrlFormat
284 && mAttribution == other.mAttribution
285 && mAttributionUrl == other.mAttributionUrl
286 && mLegendUrl == other.mLegendUrl
287 && mLegendUrlFormat == other.mLegendUrlFormat;
288}
289
291{
292 return !( *this == other );
293}
294
300
302{
303 QString name = mLayer ? mLayer->name() : QString();
304 if ( !mShortName.isEmpty() )
305 name = mShortName;
306
307 name.replace( ' ', '_' ).replace( ':', '-' ).replace( QChar( 0x2014 ) /* em-dash */, '-' );
308
309 return name.toLocal8Bit();
310}
311
312void QgsMapLayerServerProperties::readXml( const QDomNode &layerNode ) // cppcheck-suppress duplInheritedMember
313{
315 if ( metadataUrls().isEmpty() )
316 {
317 // metadataUrl is still empty, maybe it's a QGIS Project < 3.22
318 // keep for legacy
319 const QDomElement metaUrlElem = layerNode.firstChildElement( u"metadataUrl"_s );
320 if ( !metaUrlElem.isNull() )
321 {
322 const QString url = metaUrlElem.text();
323 const QString type = metaUrlElem.attribute( u"type"_s, QString() );
324 const QString format = metaUrlElem.attribute( u"format"_s, QString() );
325 const QgsMapLayerServerProperties::MetadataUrl newItem( url, type, format );
326 setMetadataUrls( QList<QgsMapLayerServerProperties::MetadataUrl>() << newItem );
327 }
328 }
329
331
332 //short name
333 const QDomElement shortNameElem = layerNode.firstChildElement( u"shortname"_s );
334 if ( !shortNameElem.isNull() )
335 {
336 mShortName = shortNameElem.text();
337 }
338
339 //title
340 const QDomElement titleElem = layerNode.firstChildElement( u"title"_s );
341 if ( !titleElem.isNull() )
342 {
343 mTitle = titleElem.text();
344 mWfsTitle = titleElem.attribute( u"wfs"_s );
345 }
346
347 //abstract
348 const QDomElement abstractElem = layerNode.firstChildElement( u"abstract"_s );
349 if ( !abstractElem.isNull() )
350 {
351 mAbstract = abstractElem.text();
352 }
353
354 //keywordList
355 const QDomElement keywordListElem = layerNode.firstChildElement( u"keywordList"_s );
356 if ( !keywordListElem.isNull() )
357 {
358 QStringList kwdList;
359 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
360 {
361 const QString keyword = n.toElement().text();
362 if ( !keyword.isEmpty() )
363 kwdList << keyword;
364 }
365 mKeywordList = kwdList.join( ", "_L1 );
366 }
367
368 //dataUrl
369 const QDomElement dataUrlElem = layerNode.firstChildElement( u"dataUrl"_s );
370 if ( !dataUrlElem.isNull() )
371 {
372 mDataUrl = dataUrlElem.text();
373 mDataUrlFormat = dataUrlElem.attribute( u"format"_s, QString() );
374 }
375
376 //attribution
377 const QDomElement attribElem = layerNode.firstChildElement( u"attribution"_s );
378 if ( !attribElem.isNull() )
379 {
380 mAttribution = attribElem.text();
381 mAttributionUrl = attribElem.attribute( u"href"_s, QString() );
382 }
383
384 //legendUrl
385 const QDomElement legendUrlElem = layerNode.firstChildElement( u"legendUrl"_s );
386 if ( !legendUrlElem.isNull() )
387 {
388 mLegendUrl = legendUrlElem.text();
389 mLegendUrlFormat = legendUrlElem.attribute( u"format"_s, QString() );
390 }
391}
392
393void QgsMapLayerServerProperties::writeXml( QDomNode &layerNode, QDomDocument &document ) const // cppcheck-suppress duplInheritedMember
394{
395 QgsServerMetadataUrlProperties::writeXml( layerNode, document );
396 QgsServerWmsDimensionProperties::writeXml( layerNode, document );
397
398 // layer short name
399 if ( !mShortName.isEmpty() )
400 {
401 QDomElement layerShortName = document.createElement( u"shortname"_s );
402 const QDomText layerShortNameText = document.createTextNode( mShortName );
403 layerShortName.appendChild( layerShortNameText );
404 layerNode.appendChild( layerShortName );
405 }
406
407 // layer title
408 if ( !mTitle.isEmpty() )
409 {
410 QDomElement layerTitle = document.createElement( u"title"_s );
411 const QDomText layerTitleText = document.createTextNode( mTitle );
412 layerTitle.appendChild( layerTitleText );
413
414 if ( mTitle != mWfsTitle )
415 {
416 layerTitle.setAttribute( "wfs", mWfsTitle );
417 }
418
419 layerNode.appendChild( layerTitle );
420 }
421
422 // layer abstract
423 if ( !mAbstract.isEmpty() )
424 {
425 QDomElement layerAbstract = document.createElement( u"abstract"_s );
426 const QDomText layerAbstractText = document.createTextNode( mAbstract );
427 layerAbstract.appendChild( layerAbstractText );
428 layerNode.appendChild( layerAbstract );
429 }
430
431 // layer keyword list
432 const QStringList keywordStringList = mKeywordList.split( ',', Qt::SkipEmptyParts );
433 if ( !keywordStringList.isEmpty() )
434 {
435 QDomElement layerKeywordList = document.createElement( u"keywordList"_s );
436 for ( int i = 0; i < keywordStringList.size(); ++i )
437 {
438 QDomElement layerKeywordValue = document.createElement( u"value"_s );
439 const QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
440 layerKeywordValue.appendChild( layerKeywordText );
441 layerKeywordList.appendChild( layerKeywordValue );
442 }
443 layerNode.appendChild( layerKeywordList );
444 }
445
446 // layer dataUrl
447 if ( !mDataUrl.isEmpty() )
448 {
449 QDomElement layerDataUrl = document.createElement( u"dataUrl"_s );
450 const QDomText layerDataUrlText = document.createTextNode( mDataUrl );
451 layerDataUrl.appendChild( layerDataUrlText );
452 layerDataUrl.setAttribute( u"format"_s, mDataUrlFormat );
453 layerNode.appendChild( layerDataUrl );
454 }
455
456 // layer legendUrl
457 if ( !mLegendUrl.isEmpty() )
458 {
459 QDomElement layerLegendUrl = document.createElement( u"legendUrl"_s );
460 const QDomText layerLegendUrlText = document.createTextNode( mLegendUrl );
461 layerLegendUrl.appendChild( layerLegendUrlText );
462 layerLegendUrl.setAttribute( u"format"_s, mLegendUrlFormat );
463 layerNode.appendChild( layerLegendUrl );
464 }
465
466 // layer attribution
467 if ( !mAttribution.isEmpty() )
468 {
469 QDomElement layerAttribution = document.createElement( u"attribution"_s );
470 const QDomText layerAttributionText = document.createTextNode( mAttribution );
471 layerAttribution.appendChild( layerAttributionText );
472 layerAttribution.setAttribute( u"href"_s, mAttributionUrl );
473 layerNode.appendChild( layerAttribution );
474 }
475}
@ Vector
Vector layer.
Definition qgis.h:207
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.
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.