Skip to content

Commit 628a60b

Browse files
authoredOct 24, 2017
Merge pull request #5396 from mhugent/server_wms_print_layers
Server wms print layers
2 parents bb21395 + c993888 commit 628a60b

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed
 

‎src/server/services/wms/qgswmsparameters.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
***************************************************************************/
1717

1818
#include "qgswmsparameters.h"
19+
#include "qgsdatasourceuri.h"
1920
#include "qgsmessagelog.h"
2021
#include <iostream>
2122

@@ -512,6 +513,16 @@ namespace QgsWms
512513
raiseError( name );
513514
}
514515
}
516+
else //maybe an external wms parameter?
517+
{
518+
int separator = key.indexOf( ":" );
519+
if ( separator >= 1 )
520+
{
521+
QString id = key.left( separator );
522+
QString param = key.right( key.length() - separator - 1 );
523+
mExternalWMSParameters[id].insert( param, parameters[key] );
524+
}
525+
}
515526
}
516527
}
517528
}
@@ -1880,6 +1891,23 @@ namespace QgsWms
18801891
return param;
18811892
}
18821893

1894+
QString QgsWmsParameters::externalWMSUri( const QString &id ) const
1895+
{
1896+
if ( !mExternalWMSParameters.contains( id ) )
1897+
{
1898+
return QString();
1899+
}
1900+
1901+
QgsDataSourceUri wmsUri;
1902+
const QMap<QString, QString> &paramMap = mExternalWMSParameters[ id ];
1903+
QMap<QString, QString>::const_iterator paramIt = paramMap.constBegin();
1904+
for ( ; paramIt != paramMap.constEnd(); ++paramIt )
1905+
{
1906+
wmsUri.setParam( paramIt.key().toLower(), paramIt.value() );
1907+
}
1908+
return wmsUri.encodedUri();
1909+
}
1910+
18831911
QString QgsWmsParameters::name( ParameterName name ) const
18841912
{
18851913
const QMetaEnum metaEnum( QMetaEnum::fromType<ParameterName>() );

‎src/server/services/wms/qgswmsparameters.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,13 @@ namespace QgsWms
909909
*/
910910
QgsWmsParametersComposerMap composerMapParameters( int mapId ) const;
911911

912+
/**
913+
* @brief externalWMSUri
914+
* @param id the id of the external wms
915+
* @return uri string or an empty string if the external wms id does not exist
916+
*/
917+
QString externalWMSUri( const QString &id ) const;
918+
912919
private:
913920
QString name( ParameterName name ) const;
914921
void raiseError( ParameterName name ) const;
@@ -955,6 +962,7 @@ namespace QgsWms
955962
QgsServerRequest::Parameters mRequestParameters;
956963
QMap<ParameterName, Parameter> mParameters;
957964
QMap<int, QMap<ParameterName, Parameter>> mComposerParameters;
965+
QMap<QString, QMap<QString, QString> > mExternalWMSParameters;
958966
QList<QgsProjectVersion> mVersions;
959967
};
960968
}

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ namespace QgsWms
132132
initNicknameLayers();
133133
}
134134

135+
QgsRenderer::~QgsRenderer()
136+
{
137+
removeTemporaryLayers();
138+
}
139+
135140

136141
QImage *QgsRenderer::getLegendGraphics()
137142
{
@@ -2557,6 +2562,7 @@ namespace QgsWms
25572562
}
25582563
}
25592564

2565+
mTemporaryLayers.append( highlightLayers );
25602566
return highlightLayers;
25612567
}
25622568

@@ -2602,15 +2608,27 @@ namespace QgsWms
26022608
return layers;
26032609
}
26042610

2605-
QList<QgsMapLayer *> QgsRenderer::stylizedLayers( const QList<QgsWmsParametersLayer> &params ) const
2611+
QList<QgsMapLayer *> QgsRenderer::stylizedLayers( const QList<QgsWmsParametersLayer> &params )
26062612
{
26072613
QList<QgsMapLayer *> layers;
26082614

26092615
Q_FOREACH ( QgsWmsParametersLayer param, params )
26102616
{
26112617
QString nickname = param.mNickname;
26122618
QString style = param.mStyle;
2613-
if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) )
2619+
if ( nickname.startsWith( "EXTERNAL_WMS:" ) )
2620+
{
2621+
QString externalLayerId = nickname;
2622+
externalLayerId.remove( 0, 13 );
2623+
QgsMapLayer *externalWMSLayer = createExternalWMSLayer( externalLayerId );
2624+
if ( externalWMSLayer )
2625+
{
2626+
layers.append( externalWMSLayer );
2627+
mNicknameLayers[nickname] = externalWMSLayer; //might be used later in GetPrint request
2628+
mTemporaryLayers.append( externalWMSLayer );
2629+
}
2630+
}
2631+
else if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) )
26142632
{
26152633
if ( !style.isEmpty() )
26162634
{
@@ -2633,6 +2651,25 @@ namespace QgsWms
26332651
return layers;
26342652
}
26352653

2654+
QgsMapLayer *QgsRenderer::createExternalWMSLayer( const QString &externalLayerId ) const
2655+
{
2656+
QString wmsUri = mWmsParameters.externalWMSUri( externalLayerId.toUpper() );
2657+
QgsMapLayer *wmsLayer = new QgsRasterLayer( wmsUri, externalLayerId, QStringLiteral( "wms" ) );
2658+
if ( !wmsLayer->isValid() )
2659+
{
2660+
delete wmsLayer;
2661+
return 0;
2662+
}
2663+
2664+
return wmsLayer;
2665+
}
2666+
2667+
void QgsRenderer::removeTemporaryLayers()
2668+
{
2669+
qDeleteAll( mTemporaryLayers );
2670+
mTemporaryLayers.clear();
2671+
}
2672+
26362673
QPainter *QgsRenderer::layersRendering( const QgsMapSettings &mapSettings, QImage &image, HitTest *hitTest ) const
26372674
{
26382675
QPainter *painter = nullptr;

‎src/server/services/wms/qgswmsrenderer.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ namespace QgsWms
8484
const QgsProject *project,
8585
const QgsServerRequest::Parameters &parameters );
8686

87+
~QgsRenderer();
88+
8789
/**
8890
* Returns the map legend as an image (or a null pointer in case of error). The caller takes ownership
8991
of the image object*/
@@ -154,7 +156,7 @@ namespace QgsWms
154156
void annotationsRendering( QPainter *painter ) const;
155157

156158
// Return a list of layers stylized with LAYERS/STYLES parameters
157-
QList<QgsMapLayer *> stylizedLayers( const QList<QgsWmsParametersLayer> &params ) const;
159+
QList<QgsMapLayer *> stylizedLayers( const QList<QgsWmsParametersLayer> &params );
158160

159161
// Return a list of layers stylized with SLD parameter
160162
QList<QgsMapLayer *> sldStylizedLayers( const QString &sld ) const;
@@ -274,6 +276,11 @@ namespace QgsWms
274276
//! configure the composition for the GetPrint request
275277
bool configureComposition( QgsComposition *c, const QgsMapSettings &mapSettings );
276278

279+
//! Creates external WMS layer. Caller takes ownership
280+
QgsMapLayer *createExternalWMSLayer( const QString &externalLayerId ) const;
281+
282+
void removeTemporaryLayers();
283+
277284
private:
278285

279286
const QgsServerRequest::Parameters &mParameters;
@@ -286,6 +293,7 @@ namespace QgsWms
286293
QgsWmsParameters mWmsParameters;
287294
QStringList mRestrictedLayers;
288295
QMap<QString, QgsMapLayer *> mNicknameLayers;
296+
QList<QgsMapLayer *> mTemporaryLayers;
289297

290298
public:
291299

0 commit comments

Comments
 (0)
Please sign in to comment.