From d6c7c93a1c8e0e0bbb278802c8a6f7990ad573ce Mon Sep 17 00:00:00 2001 From: Blottiere Paul Date: Tue, 5 Mar 2019 13:50:47 +0000 Subject: [PATCH] Manage external layers like highlight layers for consistency --- src/server/services/wms/qgswmsparameters.cpp | 51 ++++++++++++++++++- src/server/services/wms/qgswmsparameters.h | 9 ++++ src/server/services/wms/qgswmsrenderer.cpp | 53 ++++++++++---------- src/server/services/wms/qgswmsrenderer.h | 6 +-- 4 files changed, 87 insertions(+), 32 deletions(-) diff --git a/src/server/services/wms/qgswmsparameters.cpp b/src/server/services/wms/qgswmsparameters.cpp index ba6d0004350..6cd4b78c1ec 100644 --- a/src/server/services/wms/qgswmsparameters.cpp +++ b/src/server/services/wms/qgswmsparameters.cpp @@ -1408,6 +1408,10 @@ namespace QgsWms for ( int i = 0; i < layers.size(); i++ ) { QString layer = layers[i]; + + if ( layer.startsWith( QStringLiteral( "EXTERNAL_WMS:" ) ) ) + continue; + QgsWmsParametersLayer param; param.mNickname = layer; @@ -1492,6 +1496,27 @@ namespace QgsWms return params; } + QList QgsWmsParameters::externalLayersParameters() const + { + QList externalLayers; + + const QStringList layers = allLayersNickname(); + for ( const QString &layer : allLayersNickname() ) + { + if ( ! layer.startsWith( QStringLiteral( "EXTERNAL_WMS:" ) ) ) + continue; + + QgsWmsParametersExternalLayer externalLayer; + externalLayer.mName = layer; + externalLayer.mName.remove( 0, 13 ); + externalLayer.mUri = externalWMSUri( externalLayer.mName ); + + externalLayers << externalLayer; + } + + return externalLayers; + } + QString QgsWmsParameters::backgroundColor() const { return mWmsParameters[ QgsWmsParameter::BGCOLOR ].toString(); @@ -1577,13 +1602,35 @@ namespace QgsWms } //layers - QStringList layers; + QStringList allLayers; wmsParam = idParameter( QgsWmsParameter::LAYERS, mapId ); if ( wmsParam.isValid() ) { - layers = wmsParam.toStringList(); + allLayers = wmsParam.toStringList(); } + // external layers + QStringList layers; + QList eParams; + + for ( const auto &layer : allLayers ) + { + if ( layer.startsWith( QStringLiteral( "EXTERNAL_WMS:" ) ) ) + { + QgsWmsParametersExternalLayer externalParam; + externalParam.mName = layer; + externalParam.mName.remove( 0, 13 ); + externalParam.mUri = externalWMSUri( externalParam.mName ); + + eParams << externalParam; + } + else + { + layers << layer; + } + } + param.mExternalLayers = eParams; + QStringList styles; wmsParam = idParameter( QgsWmsParameter::STYLES, mapId ); if ( wmsParam.isValid() ) diff --git a/src/server/services/wms/qgswmsparameters.h b/src/server/services/wms/qgswmsparameters.h index 3a09f0aa6df..8c532d4fc40 100644 --- a/src/server/services/wms/qgswmsparameters.h +++ b/src/server/services/wms/qgswmsparameters.h @@ -55,6 +55,12 @@ namespace QgsWms QString mStyle; }; + struct QgsWmsParametersExternalLayer + { + QString mName; + QString mUri; + }; + struct QgsWmsParametersHighlightLayer { QString mName; @@ -79,6 +85,7 @@ namespace QgsWms float mGridX = 0; float mGridY = 0; QList mLayers; // list of layers for this composer map + QList mExternalLayers; // list of external layers for this composer map QList mHighlightLayers; // list of highlight layers for this composer map }; @@ -944,6 +951,8 @@ namespace QgsWms */ QList highlightLayersParameters() const; + QList externalLayersParameters() const; + /** * Returns HIGHLIGHT_GEOM as a list of string in WKT. * \returns highlight geometries diff --git a/src/server/services/wms/qgswmsrenderer.cpp b/src/server/services/wms/qgswmsrenderer.cpp index 7636e1618ee..8e9b49c4567 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -653,13 +653,14 @@ namespace QgsWms if ( !map->keepLayerSet() ) { - if ( cMapParams.mLayers.isEmpty() ) + if ( cMapParams.mLayers.isEmpty() && cMapParams.mExternalLayers.isEmpty() ) { map->setLayers( mapSettings.layers() ); } else { QList layerSet = stylizedLayers( cMapParams.mLayers ); + layerSet << externalLayers( cMapParams.mExternalLayers ); layerSet << highlightLayers( cMapParams.mHighlightLayers ); std::reverse( layerSet.begin(), layerSet.end() ); map->setLayers( layerSet ); @@ -856,6 +857,9 @@ namespace QgsWms setLayerAccessControlFilter( layer ); } + // add external layers + layers = layers << externalLayers( mWmsParameters.externalLayersParameters() ); + // add highlight layers above others layers = layers << highlightLayers( mWmsParameters.highlightLayersParameters() ); @@ -2914,6 +2918,26 @@ namespace QgsWms return highlightLayers; } + QList QgsRenderer::externalLayers( const QList ¶ms ) + { + QList layers; + + for ( const QgsWmsParametersExternalLayer ¶m : params ) + { + std::unique_ptr layer; + layer.reset( new QgsRasterLayer( param.mUri, param.mName, QStringLiteral( "wms" ) ) ); + + if ( layer->isValid() ) + { + // to delete later + mTemporaryLayers.append( layer.release() ); + layers << mTemporaryLayers.last(); + } + } + + return layers; + } + QList QgsRenderer::sldStylizedLayers( const QString &sld ) const { QList layers; @@ -2976,19 +3000,7 @@ namespace QgsWms { QString nickname = param.mNickname; QString style = param.mStyle; - if ( nickname.startsWith( "EXTERNAL_WMS:" ) ) - { - QString externalLayerId = nickname; - externalLayerId.remove( 0, 13 ); - QgsMapLayer *externalWMSLayer = createExternalWMSLayer( externalLayerId ); - if ( externalWMSLayer ) - { - layers.append( externalWMSLayer ); - mNicknameLayers[nickname] = externalWMSLayer; //might be used later in GetPrint request - mTemporaryLayers.append( externalWMSLayer ); - } - } - else if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) ) + if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) ) { if ( !style.isEmpty() ) { @@ -3032,19 +3044,6 @@ namespace QgsWms return layers; } - QgsMapLayer *QgsRenderer::createExternalWMSLayer( const QString &externalLayerId ) const - { - QString wmsUri = mWmsParameters.externalWMSUri( externalLayerId.toUpper() ); - QgsMapLayer *wmsLayer = new QgsRasterLayer( wmsUri, externalLayerId, QStringLiteral( "wms" ) ); - if ( !wmsLayer->isValid() ) - { - delete wmsLayer; - return nullptr; - } - - return wmsLayer; - } - void QgsRenderer::removeTemporaryLayers() { qDeleteAll( mTemporaryLayers ); diff --git a/src/server/services/wms/qgswmsrenderer.h b/src/server/services/wms/qgswmsrenderer.h index c9f50004d68..bbe2832f27c 100644 --- a/src/server/services/wms/qgswmsrenderer.h +++ b/src/server/services/wms/qgswmsrenderer.h @@ -122,6 +122,9 @@ namespace QgsWms // Build and returns highlight layers QList highlightLayers( QList params ); + // Build and returns external layers + QList externalLayers( const QList ¶ms ); + // Init a map with nickname for layers' project void initNicknameLayers(); @@ -289,9 +292,6 @@ namespace QgsWms * */ bool configurePrintLayout( QgsPrintLayout *c, const QgsMapSettings &mapSettings, bool atlasPrint = false ); - //! Creates external WMS layer. Caller takes ownership - QgsMapLayer *createExternalWMSLayer( const QString &externalLayerId ) const; - void removeTemporaryLayers(); void handlePrintErrors( const QgsLayout *layout ) const;