Skip to content

Commit

Permalink
Support external WMS layers in GetPrint and GetMap requests
Browse files Browse the repository at this point in the history
  • Loading branch information
mhugent committed Oct 17, 2017
1 parent f579f1a commit 40201b2
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
41 changes: 40 additions & 1 deletion src/server/services/wms/qgswmsrenderer.cpp
Expand Up @@ -2610,7 +2610,17 @@ namespace QgsWms
{
QString nickname = param.mNickname;
QString style = param.mStyle;
if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) )
if ( nickname.startsWith( "EXTERNAL_WMS:" ) )
{
QString externalLayerId = nickname;
externalLayerId.remove( 0, 13 );
QgsMapLayer *externalWMSLayer = createExternalWMSLayer( externalLayerId );
if ( externalWMSLayer )
{
layers.append( externalWMSLayer );
}
}
else if ( mNicknameLayers.contains( nickname ) && !mRestrictedLayers.contains( nickname ) )
{
if ( !style.isEmpty() )
{
Expand All @@ -2633,6 +2643,35 @@ namespace QgsWms
return layers;
}

QgsMapLayer *QgsRenderer::createExternalWMSLayer( const QString &externalLayerId ) const
{
QgsMapLayer *wmsLayer = 0;
QgsDataSourceUri wmsUri;

QgsServerRequest::Parameters::const_iterator it = mParameters.lowerBound( externalLayerId.toUpper() + ":" );
while ( it != mParameters.constEnd() )
{
if ( !it.key().startsWith( externalLayerId.toUpper() + ":" ) )
{
break;
}

QString paramKey = it.key();
paramKey.remove( 0, externalLayerId.size() + 1 );
wmsUri.setParam( paramKey.toLower(), it.value() );
++it;
}

wmsLayer = new QgsRasterLayer( wmsUri.encodedUri(), externalLayerId, QStringLiteral( "wms" ) );
if ( !wmsLayer->isValid() )
{
delete wmsLayer;
return 0;
}

return wmsLayer;
}

QPainter *QgsRenderer::layersRendering( const QgsMapSettings &mapSettings, QImage &image, HitTest *hitTest ) const
{
QPainter *painter = nullptr;
Expand Down
3 changes: 3 additions & 0 deletions src/server/services/wms/qgswmsrenderer.h
Expand Up @@ -274,6 +274,9 @@ namespace QgsWms
//! configure the composition for the GetPrint request
bool configureComposition( QgsComposition *c, const QgsMapSettings &mapSettings );

//! Creates external WMS layer. Caller takes ownership
QgsMapLayer *createExternalWMSLayer( const QString &externalLayerId ) const;

private:

const QgsServerRequest::Parameters &mParameters;
Expand Down

0 comments on commit 40201b2

Please sign in to comment.