1 /***************************************************************************
2 qgsvectorlayerserverproperties.cpp
3 ------------------
4 begin : August 23, 2019
5 copyright : (C) 2019 by René-Luc D'Hont
6 email : rldhont 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
18 #include "qgsvectorlayerserverproperties.h"
19 #include "qgsvectorlayer.h"
20
21 #include <QDomNode>
22
QgsVectorLayerServerProperties(QgsVectorLayer * layer)23 QgsVectorLayerServerProperties::QgsVectorLayerServerProperties( QgsVectorLayer *layer )
24 : mLayer( layer )
25 {
26 }
27
wmsDimensionDefaultDisplayLabels()28 QMap<int, QString> QgsVectorLayerServerProperties::wmsDimensionDefaultDisplayLabels()
29 {
30 QMap<int, QString> labels;
31 labels[QgsVectorLayerServerProperties::WmsDimensionInfo::AllValues] = QObject::tr( "All values" );
32 labels[QgsVectorLayerServerProperties::WmsDimensionInfo::MinValue] = QObject::tr( "Min value" );
33 labels[QgsVectorLayerServerProperties::WmsDimensionInfo::MaxValue] = QObject::tr( "Max value" );
34 labels[QgsVectorLayerServerProperties::WmsDimensionInfo::ReferenceValue] = QObject::tr( "Reference value" );
35 return labels;
36 }
37
addWmsDimension(const QgsVectorLayerServerProperties::WmsDimensionInfo & wmsDimInfo)38 bool QgsVectorLayerServerProperties::addWmsDimension( const QgsVectorLayerServerProperties::WmsDimensionInfo &wmsDimInfo )
39 {
40 for ( const QgsVectorLayerServerProperties::WmsDimensionInfo &dim : mWmsDimensions )
41 {
42 if ( dim.name == wmsDimInfo.name )
43 {
44 return false;
45 }
46 }
47 mWmsDimensions.append( wmsDimInfo );
48 return true;
49 }
50
removeWmsDimension(const QString & wmsDimName)51 bool QgsVectorLayerServerProperties::removeWmsDimension( const QString &wmsDimName )
52 {
53 for ( int i = 0; i < mWmsDimensions.size(); ++i )
54 {
55 if ( mWmsDimensions[ i ].name == wmsDimName )
56 {
57 mWmsDimensions.removeAt( i );
58 return true;
59 }
60 }
61 return false;
62 }
63
wmsDimensions() const64 const QList< QgsVectorLayerServerProperties::WmsDimensionInfo > QgsVectorLayerServerProperties::wmsDimensions() const
65 {
66 return mWmsDimensions;
67 }
68
readXml(const QDomNode & layer_node)69 void QgsVectorLayerServerProperties::readXml( const QDomNode &layer_node )
70 {
71 const QgsFields fields = mLayer->fields();
72 // QGIS Server WMS Dimensions
73 const QDomNode wmsDimsNode = layer_node.namedItem( QStringLiteral( "wmsDimensions" ) );
74 if ( !wmsDimsNode.isNull() )
75 {
76 const QDomElement wmsDimsElem = wmsDimsNode.toElement();
77 QDomNodeList wmsDimsList = wmsDimsElem.elementsByTagName( QStringLiteral( "dimension" ) );
78 for ( int i = 0; i < wmsDimsList.size(); ++i )
79 {
80 QDomElement dimElem = wmsDimsList.at( i ).toElement();
81 QString dimName = dimElem.attribute( QStringLiteral( "name" ) );
82 QString dimFieldName = dimElem.attribute( QStringLiteral( "fieldName" ) );
83 // check field name
84 int dimFieldNameIndex = fields.indexOf( dimFieldName );
85 if ( dimFieldNameIndex == -1 )
86 {
87 continue;
88 }
89 QVariant dimRefValue;
90 int dimDefaultDisplayType = dimElem.attribute( QStringLiteral( "defaultDisplayType" ) ).toInt();
91 if ( dimDefaultDisplayType == QgsVectorLayerServerProperties::WmsDimensionInfo::AllValues )
92 {
93 QString dimRefValueStr = dimElem.attribute( QStringLiteral( "referenceValue" ) );
94 if ( !dimRefValueStr.isEmpty() )
95 {
96 QgsField dimField = fields.at( dimFieldNameIndex );
97 dimRefValue = QVariant( dimRefValueStr );
98 if ( !dimField.convertCompatible( dimRefValue ) )
99 {
100 continue;
101 }
102 }
103 }
104 QgsVectorLayerServerProperties::WmsDimensionInfo dim( dimName, dimFieldName,
105 dimElem.attribute( QStringLiteral( "endFieldName" ) ),
106 dimElem.attribute( QStringLiteral( "units" ) ),
107 dimElem.attribute( QStringLiteral( "unitSymbol" ) ),
108 dimDefaultDisplayType, dimRefValue );
109 addWmsDimension( dim );
110 }
111 }
112 }
113
writeXml(QDomNode & layer_node,QDomDocument & document) const114 void QgsVectorLayerServerProperties::writeXml( QDomNode &layer_node, QDomDocument &document ) const
115 {
116 // save QGIS Server WMS Dimension definitions
117 if ( mWmsDimensions.size() > 0 )
118 {
119 QDomElement wmsDimsElem = document.createElement( QStringLiteral( "wmsDimensions" ) );
120 for ( const QgsVectorLayerServerProperties::WmsDimensionInfo &dim : mWmsDimensions )
121 {
122 QDomElement dimElem = document.createElement( QStringLiteral( "dimension" ) );
123 dimElem.setAttribute( QStringLiteral( "name" ), dim.name );
124 dimElem.setAttribute( QStringLiteral( "fieldName" ), dim.fieldName );
125 dimElem.setAttribute( QStringLiteral( "endFieldName" ), dim.endFieldName );
126 dimElem.setAttribute( QStringLiteral( "units" ), dim.units );
127 dimElem.setAttribute( QStringLiteral( "unitSymbol" ), dim.unitSymbol );
128 dimElem.setAttribute( QStringLiteral( "defaultDisplayType" ), dim.defaultDisplayType );
129 dimElem.setAttribute( QStringLiteral( "referenceValue" ), dim.referenceValue.toString() );
130 wmsDimsElem.appendChild( dimElem );
131 }
132 layer_node.appendChild( wmsDimsElem );
133 }
134 }
135