QGIS API Documentation 4.1.0-Master (60fea48833c)
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->setAbstract( mAbstract );
263 properties->setKeywordList( mKeywordList );
264 properties->setDataUrl( mDataUrl );
265 properties->setDataUrlFormat( mDataUrlFormat );
266 properties->setAttribution( mAttribution );
267 properties->setAttributionUrl( mAttributionUrl );
268 properties->setLegendUrl( mLegendUrl );
269 properties->setLegendUrlFormat( mLegendUrlFormat );
270}
271
273{
276 && mShortName == other.mShortName
277 && mTitle == other.mTitle
278 && mAbstract == other.mAbstract
279 && mKeywordList == other.mKeywordList
280 && mDataUrl == other.mDataUrl
281 && mDataUrlFormat == other.mDataUrlFormat
282 && mAttribution == other.mAttribution
283 && mAttributionUrl == other.mAttributionUrl
284 && mLegendUrl == other.mLegendUrl
285 && mLegendUrlFormat == other.mLegendUrlFormat;
286}
287
289{
290 return !( *this == other );
291}
292
298
300{
301 QString name = mLayer ? mLayer->name() : QString();
302 if ( !mShortName.isEmpty() )
303 name = mShortName;
304
305 name.replace( ' ', '_' ).replace( ':', '-' ).replace( QChar( 0x2014 ) /* em-dash */, '-' );
306
307 return name.toLocal8Bit();
308}
309
310void QgsMapLayerServerProperties::readXml( const QDomNode &layerNode ) // cppcheck-suppress duplInheritedMember
311{
313 if ( metadataUrls().isEmpty() )
314 {
315 // metadataUrl is still empty, maybe it's a QGIS Project < 3.22
316 // keep for legacy
317 const QDomElement metaUrlElem = layerNode.firstChildElement( u"metadataUrl"_s );
318 if ( !metaUrlElem.isNull() )
319 {
320 const QString url = metaUrlElem.text();
321 const QString type = metaUrlElem.attribute( u"type"_s, QString() );
322 const QString format = metaUrlElem.attribute( u"format"_s, QString() );
323 const QgsMapLayerServerProperties::MetadataUrl newItem( url, type, format );
324 setMetadataUrls( QList<QgsMapLayerServerProperties::MetadataUrl>() << newItem );
325 }
326 }
327
329
330 //short name
331 const QDomElement shortNameElem = layerNode.firstChildElement( u"shortname"_s );
332 if ( !shortNameElem.isNull() )
333 {
334 mShortName = shortNameElem.text();
335 }
336
337 //title
338 const QDomElement titleElem = layerNode.firstChildElement( u"title"_s );
339 if ( !titleElem.isNull() )
340 {
341 mTitle = titleElem.text();
342 mWfsTitle = titleElem.attribute( u"wfs"_s );
343 }
344
345 //abstract
346 const QDomElement abstractElem = layerNode.firstChildElement( u"abstract"_s );
347 if ( !abstractElem.isNull() )
348 {
349 mAbstract = abstractElem.text();
350 }
351
352 //keywordList
353 const QDomElement keywordListElem = layerNode.firstChildElement( u"keywordList"_s );
354 if ( !keywordListElem.isNull() )
355 {
356 QStringList kwdList;
357 for ( QDomNode n = keywordListElem.firstChild(); !n.isNull(); n = n.nextSibling() )
358 {
359 const QString keyword = n.toElement().text();
360 if ( !keyword.isEmpty() )
361 kwdList << keyword;
362 }
363 mKeywordList = kwdList.join( ", "_L1 );
364 }
365
366 //dataUrl
367 const QDomElement dataUrlElem = layerNode.firstChildElement( u"dataUrl"_s );
368 if ( !dataUrlElem.isNull() )
369 {
370 mDataUrl = dataUrlElem.text();
371 mDataUrlFormat = dataUrlElem.attribute( u"format"_s, QString() );
372 }
373
374 //attribution
375 const QDomElement attribElem = layerNode.firstChildElement( u"attribution"_s );
376 if ( !attribElem.isNull() )
377 {
378 mAttribution = attribElem.text();
379 mAttributionUrl = attribElem.attribute( u"href"_s, QString() );
380 }
381
382 //legendUrl
383 const QDomElement legendUrlElem = layerNode.firstChildElement( u"legendUrl"_s );
384 if ( !legendUrlElem.isNull() )
385 {
386 mLegendUrl = legendUrlElem.text();
387 mLegendUrlFormat = legendUrlElem.attribute( u"format"_s, QString() );
388 }
389}
390
391void QgsMapLayerServerProperties::writeXml( QDomNode &layerNode, QDomDocument &document ) const // cppcheck-suppress duplInheritedMember
392{
393 QgsServerMetadataUrlProperties::writeXml( layerNode, document );
394 QgsServerWmsDimensionProperties::writeXml( layerNode, document );
395
396 // layer short name
397 if ( !mShortName.isEmpty() )
398 {
399 QDomElement layerShortName = document.createElement( u"shortname"_s );
400 const QDomText layerShortNameText = document.createTextNode( mShortName );
401 layerShortName.appendChild( layerShortNameText );
402 layerNode.appendChild( layerShortName );
403 }
404
405 // layer title
406 if ( !mTitle.isEmpty() )
407 {
408 QDomElement layerTitle = document.createElement( u"title"_s );
409 const QDomText layerTitleText = document.createTextNode( mTitle );
410 layerTitle.appendChild( layerTitleText );
411
412 if ( mTitle != mWfsTitle )
413 {
414 layerTitle.setAttribute( "wfs", mWfsTitle );
415 }
416
417 layerNode.appendChild( layerTitle );
418 }
419
420 // layer abstract
421 if ( !mAbstract.isEmpty() )
422 {
423 QDomElement layerAbstract = document.createElement( u"abstract"_s );
424 const QDomText layerAbstractText = document.createTextNode( mAbstract );
425 layerAbstract.appendChild( layerAbstractText );
426 layerNode.appendChild( layerAbstract );
427 }
428
429 // layer keyword list
430 const QStringList keywordStringList = mKeywordList.split( ',', Qt::SkipEmptyParts );
431 if ( !keywordStringList.isEmpty() )
432 {
433 QDomElement layerKeywordList = document.createElement( u"keywordList"_s );
434 for ( int i = 0; i < keywordStringList.size(); ++i )
435 {
436 QDomElement layerKeywordValue = document.createElement( u"value"_s );
437 const QDomText layerKeywordText = document.createTextNode( keywordStringList.at( i ).trimmed() );
438 layerKeywordValue.appendChild( layerKeywordText );
439 layerKeywordList.appendChild( layerKeywordValue );
440 }
441 layerNode.appendChild( layerKeywordList );
442 }
443
444 // layer dataUrl
445 if ( !mDataUrl.isEmpty() )
446 {
447 QDomElement layerDataUrl = document.createElement( u"dataUrl"_s );
448 const QDomText layerDataUrlText = document.createTextNode( mDataUrl );
449 layerDataUrl.appendChild( layerDataUrlText );
450 layerDataUrl.setAttribute( u"format"_s, mDataUrlFormat );
451 layerNode.appendChild( layerDataUrl );
452 }
453
454 // layer legendUrl
455 if ( !mLegendUrl.isEmpty() )
456 {
457 QDomElement layerLegendUrl = document.createElement( u"legendUrl"_s );
458 const QDomText layerLegendUrlText = document.createTextNode( mLegendUrl );
459 layerLegendUrl.appendChild( layerLegendUrlText );
460 layerLegendUrl.setAttribute( u"format"_s, mLegendUrlFormat );
461 layerNode.appendChild( layerLegendUrl );
462 }
463
464 // layer attribution
465 if ( !mAttribution.isEmpty() )
466 {
467 QDomElement layerAttribution = document.createElement( u"attribution"_s );
468 const QDomText layerAttributionText = document.createTextNode( mAttribution );
469 layerAttribution.appendChild( layerAttributionText );
470 layerAttribution.setAttribute( u"href"_s, mAttributionUrl );
471 layerNode.appendChild( layerAttribution );
472 }
473}
@ 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:470
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.