Skip to content

Commit 1ec7ad5

Browse files
committedJun 13, 2016
[WMS provider] Tolerate GetCapabilities response with several top-level layers
Fix #13762 Also, in case there's a single layer advertized, show it in the browser.
1 parent dfe4553 commit 1ec7ad5

File tree

4 files changed

+44
-29
lines changed

4 files changed

+44
-29
lines changed
 

‎src/providers/wms/qgswmscapabilities.cpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ void QgsWmsCapabilities::parseCapability( QDomElement const & e, QgsWmsCapabilit
570570
}
571571
else if ( tagName == "Layer" )
572572
{
573-
parseLayer( e1, capabilityProperty.layer );
573+
QgsWmsLayerProperty layer;
574+
parseLayer( e1, layer );
575+
capabilityProperty.layers.push_back( layer );
574576
}
575577
else if ( tagName == "VendorSpecificCapabilities" )
576578
{
@@ -947,10 +949,6 @@ void QgsWmsCapabilities::parseLayer( QDomElement const & e, QgsWmsLayerProperty&
947949
// Store if the layer is queryable
948950
mQueryableForLayer[ layerProperty.name ] = layerProperty.queryable;
949951

950-
// Store the available Coordinate Reference Systems for the layer so that it
951-
// can be combined with others later in supportedCrsForLayers()
952-
mCrsForLayer[ layerProperty.name ] = layerProperty.crs;
953-
954952
// Insert into the local class' registry
955953
mLayersSupported.push_back( layerProperty );
956954

@@ -966,13 +964,6 @@ void QgsWmsCapabilities::parseLayer( QDomElement const & e, QgsWmsLayerProperty&
966964
mLayerParentNames[ layerProperty.orderId ] = QStringList() << layerProperty.name << layerProperty.title << layerProperty.abstract;
967965
}
968966

969-
if ( !parentProperty )
970-
{
971-
// Why clear()? I need top level access. Seems to work in standard select dialog without clear.
972-
//layerProperty.layer.clear();
973-
layerProperty.crs.clear();
974-
}
975-
976967
//QgsDebugMsg( "exiting." );
977968
}
978969

‎src/providers/wms/qgswmscapabilities.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,12 @@ struct QgsWmsCapabilityProperty
399399
{
400400
QgsWmsRequestProperty request;
401401
QgsWmsExceptionProperty exception;
402-
QgsWmsLayerProperty layer;
402+
403+
// Top level layer should normally be present max once
404+
// <element name="Capability">
405+
// <element ref="wms:Layer" minOccurs="0"/> - default maxOccurs=1
406+
// but there are a few non conformant capabilities around (#13762)
407+
QList<QgsWmsLayerProperty> layers;
403408

404409
QList<QgsWmtsTileLayer> tileLayers;
405410
QHash<QString, QgsWmtsTileMatrixSet> tileMatrixSets;
@@ -663,11 +668,6 @@ class QgsWmsCapabilities
663668
*/
664669
QMap<QString, bool> mQueryableForLayer;
665670

666-
/**
667-
* available CRSs per layer
668-
*/
669-
QMap<QString, QStringList > mCrsForLayer;
670-
671671
/**
672672
* layers hosted by the WMS
673673
*/

‎src/providers/wms/qgswmsdataitems.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,37 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
8686
QgsWmsCapabilitiesProperty capabilitiesProperty = caps.capabilitiesProperty();
8787
const QgsWmsCapabilityProperty& capabilityProperty = capabilitiesProperty.capability;
8888

89-
// Top level layer is present max once
90-
// <element name="Capability">
91-
// <element ref="wms:Layer" minOccurs="0"/> - default maxOccurs=1
92-
const QgsWmsLayerProperty &topLayerProperty = capabilityProperty.layer;
93-
Q_FOREACH ( const QgsWmsLayerProperty &layerProperty, topLayerProperty.layer )
89+
// If we have several top-level layers, or if we just have one single top-level layer,
90+
// then use those top-level layers directly
91+
if ( capabilityProperty.layers.size() > 1 ||
92+
( capabilityProperty.layers.size() == 1 && capabilityProperty.layers[0].layer.size() == 0 ) )
9493
{
95-
// Attention, the name may be empty
96-
QgsDebugMsg( QString::number( layerProperty.orderId ) + ' ' + layerProperty.name + ' ' + layerProperty.title );
97-
QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name;
94+
Q_FOREACH ( const QgsWmsLayerProperty& layerProperty, capabilityProperty.layers )
95+
{
96+
// Attention, the name may be empty
97+
QgsDebugMsg( QString::number( layerProperty.orderId ) + ' ' + layerProperty.name + ' ' + layerProperty.title );
98+
QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name;
99+
100+
QgsWMSLayerItem *layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + '/' + pathName, capabilitiesProperty, uri, layerProperty );
101+
102+
children << layer;
103+
}
104+
}
105+
// Otherwise if we have just one single top-level layers with children, then
106+
// skip this top-level layer and iterate directly on its children
107+
// Note (E. Rouault): this was the historical behaviour before fixing #13762
108+
else if ( capabilityProperty.layers.size() == 1 )
109+
{
110+
Q_FOREACH ( const QgsWmsLayerProperty &layerProperty, capabilityProperty.layers[0].layer )
111+
{
112+
// Attention, the name may be empty
113+
QgsDebugMsg( QString::number( layerProperty.orderId ) + ' ' + layerProperty.name + ' ' + layerProperty.title );
114+
QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name;
98115

99-
QgsWMSLayerItem *layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + '/' + pathName, capabilitiesProperty, uri, layerProperty );
116+
QgsWMSLayerItem *layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + '/' + pathName, capabilitiesProperty, uri, layerProperty );
100117

101-
children << layer;
118+
children << layer;
119+
}
102120
}
103121
}
104122

‎src/providers/wms/qgswmsprovider.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,13 @@ static const QgsWmsLayerProperty* _findNestedLayerProperty( const QString& layer
961961

962962
bool QgsWmsProvider::extentForNonTiledLayer( const QString& layerName, const QString& crs, QgsRectangle& extent )
963963
{
964-
const QgsWmsLayerProperty* layerProperty = _findNestedLayerProperty( layerName, &mCaps.mCapabilities.capability.layer );
964+
const QgsWmsLayerProperty* layerProperty = nullptr;
965+
Q_FOREACH ( const QgsWmsLayerProperty& toplevelLayer, mCaps.mCapabilities.capability.layers )
966+
{
967+
layerProperty = _findNestedLayerProperty( layerName, &toplevelLayer );
968+
if ( layerProperty )
969+
break;
970+
}
965971
if ( !layerProperty )
966972
return false;
967973

0 commit comments

Comments
 (0)
Please sign in to comment.