@@ -61,33 +61,78 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
61
61
QgsDebugMsg ( " encodedUri = " + encodedUri );
62
62
63
63
QgsWmsProvider *wmsProvider = new QgsWmsProvider ( encodedUri );
64
- if ( !wmsProvider ) return children;
64
+ if ( !wmsProvider )
65
+ return children;
65
66
66
67
// Attention: supportedLayers() gives tree leafes, not top level
67
- if ( !wmsProvider->supportedLayers ( mLayerProperties ) )
68
+ QVector<QgsWmsLayerProperty> layerProperties;
69
+ if ( wmsProvider->supportedLayers ( layerProperties ) )
68
70
{
69
- // children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) );
70
- // TODO: show the error without adding child
71
- return children;
72
- }
71
+ const QgsWmsCapabilitiesProperty &capabilitiesProperty = wmsProvider->capabilitiesProperty ();
72
+ const QgsWmsCapabilityProperty &capabilityProperty = capabilitiesProperty.capability ;
73
+
74
+ // Top level layer is present max once
75
+ // <element name="Capability">
76
+ // <element ref="wms:Layer" minOccurs="0"/> - default maxOccurs=1
77
+ const QgsWmsLayerProperty &topLayerProperty = capabilityProperty.layer ;
78
+ foreach ( const QgsWmsLayerProperty &layerProperty, topLayerProperty.layer )
79
+ {
80
+ // Attention, the name may be empty
81
+ QgsDebugMsg ( QString::number ( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title );
82
+ QString pathName = layerProperty.name .isEmpty () ? QString::number ( layerProperty.orderId ) : layerProperty.name ;
73
83
74
- QgsWmsCapabilitiesProperty mCapabilitiesProperty = wmsProvider->capabilitiesProperty ();
75
- QgsWmsCapabilityProperty capabilityProperty = mCapabilitiesProperty .capability ;
84
+ QgsWMSLayerItem *layer = new QgsWMSLayerItem ( this , layerProperty.title , mPath + " /" + pathName, capabilitiesProperty, uri, layerProperty );
76
85
77
- // Top level layer is present max once
78
- // <element name="Capability">
79
- // <element ref="wms:Layer" minOccurs="0"/> - default maxOccurs=1
80
- QgsWmsLayerProperty topLayerProperty = capabilityProperty.layer ;
81
- foreach ( QgsWmsLayerProperty layerProperty, topLayerProperty.layer )
82
- {
83
- // Attention, the name may be empty
84
- QgsDebugMsg ( QString::number ( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title );
85
- QString pathName = layerProperty.name .isEmpty () ? QString::number ( layerProperty.orderId ) : layerProperty.name ;
86
+ children << layer;
87
+ }
88
+ }
86
89
87
- QgsWMSLayerItem * layer = new QgsWMSLayerItem ( this , layerProperty.title , mPath + " /" + pathName, mCapabilitiesProperty , uri, layerProperty );
90
+ QList<QgsWmtsTileLayer> tileLayers;
91
+ if ( wmsProvider->supportedTileLayers ( tileLayers ) )
92
+ {
93
+ QHash<QString, QgsWmtsTileMatrixSet> tileMatrixSets;
94
+ wmsProvider->supportedTileMatrixSets ( tileMatrixSets );
88
95
89
- children.append ( layer );
96
+ foreach ( const QgsWmtsTileLayer &l, tileLayers )
97
+ {
98
+ QString title = l.title .isEmpty () ? l.identifier : l.title ;
99
+ QgsDataItem *layerItem = l.styles .size () == 1 ? this : new QgsDataCollectionItem ( this , title, mPath + " /" + l.identifier );
100
+ if ( layerItem != this )
101
+ addChildItem ( layerItem );
102
+
103
+ foreach ( const QgsWmtsStyle &style, l.styles )
104
+ {
105
+ QgsDataItem *styleItem = l.setLinks .size () == 1 ? layerItem : new QgsDataCollectionItem ( layerItem, style.title .isEmpty () ? style.identifier : style.title , layerItem->path () + " /" + style.identifier );
106
+ if ( styleItem != layerItem )
107
+ layerItem->addChildItem ( styleItem );
108
+
109
+ foreach ( const QgsWmtsTileMatrixSetLink &setLink, l.setLinks )
110
+ {
111
+ QgsDataItem *linkItem = l.formats .size () == 1 ? styleItem : new QgsDataCollectionItem ( styleItem, setLink.tileMatrixSet , styleItem->path () + " /" + setLink.tileMatrixSet );
112
+ if ( linkItem != styleItem )
113
+ styleItem->addChildItem ( linkItem );
114
+
115
+ foreach ( QString format, l.formats )
116
+ {
117
+ QString name;
118
+ if ( layerItem == this )
119
+ name += ( l.title .isEmpty () ? l.identifier : l.title ) + " - " ;
120
+ if ( styleItem == layerItem )
121
+ name += ( style.title .isEmpty () ? style.identifier : style.title ) + " - " ;
122
+ if ( linkItem == styleItem )
123
+ name += setLink.tileMatrixSet + " - " ;
124
+ name += format;
125
+
126
+ QgsDataItem *layerItem = new QgsWMTSLayerItem ( linkItem, name, linkItem->path () + " /" + name, uri,
127
+ l.identifier , format, style.identifier , setLink.tileMatrixSet , tileMatrixSets[ setLink.tileMatrixSet ].crs , title );
128
+
129
+ linkItem->addChildItem ( layerItem );
130
+ }
131
+ }
132
+ }
133
+ }
90
134
}
135
+
91
136
return children;
92
137
}
93
138
@@ -142,18 +187,18 @@ void QgsWMSConnectionItem::deleteConnection()
142
187
143
188
// ---------------------------------------------------------------------------
144
189
145
- QgsWMSLayerItem::QgsWMSLayerItem ( QgsDataItem* parent, QString name, QString path, QgsWmsCapabilitiesProperty capabilitiesProperty, QgsDataSourceURI dataSourceUri, QgsWmsLayerProperty layerProperty )
146
- : QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" ),
147
- mCapabilitiesProperty( capabilitiesProperty ),
148
- mDataSourceUri( dataSourceUri ),
149
- mLayerProperty( layerProperty )
150
- // mProviderKey ("wms"),
151
- // mLayerType ( QgsLayerItem::Raster )
190
+ QgsWMSLayerItem::QgsWMSLayerItem ( QgsDataItem* parent, QString name, QString path, const QgsWmsCapabilitiesProperty &capabilitiesProperty, QgsDataSourceURI dataSourceUri, const QgsWmsLayerProperty &layerProperty )
191
+ : QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" )
192
+ , mCapabilitiesProperty( capabilitiesProperty )
193
+ , mDataSourceUri( dataSourceUri )
194
+ , mLayerProperty( layerProperty )
152
195
{
153
196
QgsDebugMsg ( " uri = " + mDataSourceUri .encodedUri () );
197
+
154
198
mUri = createUri ();
199
+
155
200
// Populate everything, it costs nothing, all info about layers is collected
156
- foreach ( QgsWmsLayerProperty layerProperty, mLayerProperty .layer )
201
+ foreach ( const QgsWmsLayerProperty & layerProperty, mLayerProperty .layer )
157
202
{
158
203
// Attention, the name may be empty
159
204
QgsDebugMsg ( QString::number ( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title );
@@ -162,11 +207,12 @@ QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString pat
162
207
mChildren .append ( layer );
163
208
}
164
209
165
- if ( mChildren .size () == 0 )
210
+ if ( mChildren .isEmpty () )
166
211
{
167
212
// mIcon = iconRaster();
168
213
mIcon = QgsApplication::getThemeIcon ( " mIconWms.svg" );
169
214
}
215
+
170
216
mPopulated = true ;
171
217
}
172
218
@@ -186,8 +232,8 @@ QString QgsWMSLayerItem::createUri()
186
232
187
233
QString format;
188
234
// get first supported by qt and server
189
- QVector<QgsWmsSupportedFormat> formats = QgsWmsProvider::supportedFormats ();
190
- foreach ( QgsWmsSupportedFormat f, formats )
235
+ QVector<QgsWmsSupportedFormat> formats ( QgsWmsProvider::supportedFormats () );
236
+ foreach ( const QgsWmsSupportedFormat & f, formats )
191
237
{
192
238
if ( mCapabilitiesProperty .capability .request .getMap .format .indexOf ( f.format ) >= 0 )
193
239
{
@@ -219,6 +265,48 @@ QString QgsWMSLayerItem::createUri()
219
265
return mDataSourceUri .encodedUri ();
220
266
}
221
267
268
+ // ---------------------------------------------------------------------------
269
+
270
+ QgsWMTSLayerItem::QgsWMTSLayerItem ( QgsDataItem *parent,
271
+ const QString &name,
272
+ const QString &path,
273
+ const QgsDataSourceURI &uri,
274
+ const QString &id,
275
+ const QString &format,
276
+ const QString &style,
277
+ const QString &tileMatrixSet,
278
+ const QString &crs,
279
+ const QString &title )
280
+ : QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" )
281
+ , mDataSourceUri( uri )
282
+ , mId( id )
283
+ , mFormat( format )
284
+ , mStyle( style )
285
+ , mTileMatrixSet( tileMatrixSet )
286
+ , mCrs( crs )
287
+ , mTitle( title )
288
+ {
289
+ mUri = createUri ();
290
+ mPopulated = true ;
291
+ }
292
+
293
+ QgsWMTSLayerItem::~QgsWMTSLayerItem ()
294
+ {
295
+ }
296
+
297
+ QString QgsWMTSLayerItem::createUri ()
298
+ {
299
+ // TODO dimensions
300
+
301
+ QgsDataSourceURI uri ( mDataSourceUri );
302
+ uri.setParam ( " layers" , mId );
303
+ uri.setParam ( " styles" , mStyle );
304
+ uri.setParam ( " format" , mFormat );
305
+ uri.setParam ( " crs" , mCrs );
306
+ uri.setParam ( " tileMatrixSet" , mTileMatrixSet );
307
+ return uri.encodedUri ();
308
+ }
309
+
222
310
// ---------------------------------------------------------------------------
223
311
QgsWMSRootItem::QgsWMSRootItem ( QgsDataItem* parent, QString name, QString path )
224
312
: QgsDataCollectionItem( parent, name, path )
0 commit comments