Skip to content

Commit 0dc0483

Browse files
committed
support wmts layers to browser (implements #9492)
1 parent c471858 commit 0dc0483

File tree

2 files changed

+145
-35
lines changed

2 files changed

+145
-35
lines changed

src/providers/wms/qgswmsdataitems.cpp

+118-30
Original file line numberDiff line numberDiff line change
@@ -61,33 +61,78 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
6161
QgsDebugMsg( "encodedUri = " + encodedUri );
6262

6363
QgsWmsProvider *wmsProvider = new QgsWmsProvider( encodedUri );
64-
if ( !wmsProvider ) return children;
64+
if ( !wmsProvider )
65+
return children;
6566

6667
// Attention: supportedLayers() gives tree leafes, not top level
67-
if ( !wmsProvider->supportedLayers( mLayerProperties ) )
68+
QVector<QgsWmsLayerProperty> layerProperties;
69+
if ( wmsProvider->supportedLayers( layerProperties ) )
6870
{
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;
7383

74-
QgsWmsCapabilitiesProperty mCapabilitiesProperty = wmsProvider->capabilitiesProperty();
75-
QgsWmsCapabilityProperty capabilityProperty = mCapabilitiesProperty.capability;
84+
QgsWMSLayerItem *layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, capabilitiesProperty, uri, layerProperty );
7685

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+
}
8689

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 );
8895

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+
}
90134
}
135+
91136
return children;
92137
}
93138

@@ -142,18 +187,18 @@ void QgsWMSConnectionItem::deleteConnection()
142187

143188
// ---------------------------------------------------------------------------
144189

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 )
152195
{
153196
QgsDebugMsg( "uri = " + mDataSourceUri.encodedUri() );
197+
154198
mUri = createUri();
199+
155200
// Populate everything, it costs nothing, all info about layers is collected
156-
foreach ( QgsWmsLayerProperty layerProperty, mLayerProperty.layer )
201+
foreach ( const QgsWmsLayerProperty &layerProperty, mLayerProperty.layer )
157202
{
158203
// Attention, the name may be empty
159204
QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title );
@@ -162,11 +207,12 @@ QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString pat
162207
mChildren.append( layer );
163208
}
164209

165-
if ( mChildren.size() == 0 )
210+
if ( mChildren.isEmpty() )
166211
{
167212
//mIcon = iconRaster();
168213
mIcon = QgsApplication::getThemeIcon( "mIconWms.svg" );
169214
}
215+
170216
mPopulated = true;
171217
}
172218

@@ -186,8 +232,8 @@ QString QgsWMSLayerItem::createUri()
186232

187233
QString format;
188234
// 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 )
191237
{
192238
if ( mCapabilitiesProperty.capability.request.getMap.format.indexOf( f.format ) >= 0 )
193239
{
@@ -219,6 +265,48 @@ QString QgsWMSLayerItem::createUri()
219265
return mDataSourceUri.encodedUri();
220266
}
221267

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+
222310
// ---------------------------------------------------------------------------
223311
QgsWMSRootItem::QgsWMSRootItem( QgsDataItem* parent, QString name, QString path )
224312
: QgsDataCollectionItem( parent, name, path )

src/providers/wms/qgswmsdataitems.h

+27-5
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@ class QgsWMSConnectionItem : public QgsDataCollectionItem
3131

3232
virtual QList<QAction*> actions();
3333

34-
QgsWmsCapabilitiesProperty mCapabilitiesProperty;
35-
QString mConnInfo;
36-
QVector<QgsWmsLayerProperty> mLayerProperties;
37-
3834
public slots:
3935
void editConnection();
4036
void deleteConnection();
@@ -47,7 +43,9 @@ class QgsWMSLayerItem : public QgsLayerItem
4743
Q_OBJECT
4844
public:
4945
QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path,
50-
QgsWmsCapabilitiesProperty capabilitiesProperty, QgsDataSourceURI dataSourceUri, QgsWmsLayerProperty layerProperties );
46+
const QgsWmsCapabilitiesProperty &capabilitiesProperty,
47+
QgsDataSourceURI dataSourceUri,
48+
const QgsWmsLayerProperty &layerProperty );
5149
~QgsWMSLayerItem();
5250

5351
QString createUri();
@@ -57,6 +55,30 @@ class QgsWMSLayerItem : public QgsLayerItem
5755
QgsWmsLayerProperty mLayerProperty;
5856
};
5957

58+
class QgsWMTSLayerItem : public QgsLayerItem
59+
{
60+
Q_OBJECT
61+
public:
62+
QgsWMTSLayerItem( QgsDataItem* parent,
63+
const QString &name,
64+
const QString &path,
65+
const QgsDataSourceURI &dataSourceUri,
66+
const QString &id,
67+
const QString &format,
68+
const QString &style,
69+
const QString &tileMatrixSet,
70+
const QString &crs,
71+
const QString &title );
72+
~QgsWMTSLayerItem();
73+
74+
QString createUri();
75+
QString layerName() const { return mTitle; }
76+
77+
private:
78+
QgsDataSourceURI mDataSourceUri;
79+
QString mId, mFormat, mStyle, mTileMatrixSet, mCrs, mTitle;
80+
};
81+
6082
class QgsWMSRootItem : public QgsDataCollectionItem
6183
{
6284
Q_OBJECT

0 commit comments

Comments
 (0)