Skip to content

Commit 89b0ea9

Browse files
committed
[FEATURE]: wms server has possibility to set transparency on layer/group level
1 parent d582f85 commit 89b0ea9

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

src/mapserver/qgswmsserver.cpp

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* (at your option) any later version. *
1515
* *
1616
***************************************************************************/
17+
1718
#include "qgswmsserver.h"
1819
#include "qgsconfigparser.h"
1920
#include "qgscrscache.h"
@@ -613,13 +614,18 @@ QImage* QgsWMSServer::getMap()
613614
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
614615
QStringList selectedLayerIdList = applyFeatureSelections( layersList );
615616

617+
QHash<QgsVectorLayer*, QgsFeatureRendererV2*> bkVectorRenderers;
618+
QHash< QgsRasterLayer*, QgsRasterRenderer* > bkRasterRenderers;
619+
applyOpacities( layersList, bkVectorRenderers, bkRasterRenderers );
620+
616621
mMapRenderer->render( &thePainter );
617622
if ( mConfigParser )
618623
{
619624
//draw configuration format specific overlay items
620625
mConfigParser->drawOverlays( &thePainter, theImage->dotsPerMeterX() / 1000.0 * 25.4, theImage->width(), theImage->height() );
621626
}
622627

628+
restoreOpacities( bkVectorRenderers, bkRasterRenderers );
623629
restoreLayerFilters( originalLayerFilters );
624630
clearFeatureSelections( selectedLayerIdList );
625631

@@ -1978,6 +1984,101 @@ void QgsWMSServer::clearFeatureSelections( const QStringList& layerIds ) const
19781984
return;
19791985
}
19801986

1987+
void QgsWMSServer::applyOpacities( const QStringList& layerList, QHash<QgsVectorLayer*, QgsFeatureRendererV2*>& vectorRenderers,
1988+
QHash< QgsRasterLayer*, QgsRasterRenderer* >& rasterRenderers )
1989+
{
1990+
//get opacity list
1991+
QMap<QString, QString>::const_iterator opIt = mParameterMap.find( "OPACITIES" );
1992+
if ( opIt == mParameterMap.constEnd() )
1993+
{
1994+
return;
1995+
}
1996+
QStringList opacityList = opIt.value().split( "," );
1997+
1998+
//collect leaf layers and their opacity
1999+
QList< QPair< QgsMapLayer*, int > > layerOpacityList;
2000+
QStringList::const_iterator oIt = opacityList.constBegin();
2001+
QStringList::const_iterator lIt = layerList.constBegin();
2002+
for ( ; oIt != opacityList.constEnd(); ++oIt, ++lIt )
2003+
{
2004+
//get layer list for
2005+
int opacity = oIt->toInt();
2006+
if ( opacity < 0 || opacity > 255 )
2007+
{
2008+
continue;
2009+
}
2010+
QList<QgsMapLayer*> llist = mConfigParser->mapLayerFromStyle( *lIt, "" );
2011+
QList<QgsMapLayer*>::const_iterator lListIt = llist.constBegin();
2012+
for ( ; lListIt != llist.constEnd(); ++lListIt )
2013+
{
2014+
layerOpacityList.push_back( qMakePair( *lListIt, opacity ) );
2015+
}
2016+
}
2017+
2018+
QList< QPair< QgsMapLayer*, int > >::const_iterator lOpIt = layerOpacityList.constBegin();
2019+
for ( ; lOpIt != layerOpacityList.constEnd(); ++lOpIt )
2020+
{
2021+
//vector or raster?
2022+
QgsMapLayer* ml = lOpIt->first;
2023+
int opacity = lOpIt->second;
2024+
if ( !ml || opacity == 255 )
2025+
{
2026+
continue;
2027+
}
2028+
2029+
if ( ml->type() == QgsMapLayer::VectorLayer )
2030+
{
2031+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( ml );
2032+
if ( vl && vl->isUsingRendererV2() )
2033+
{
2034+
QgsFeatureRendererV2* rendererV2 = vl->rendererV2();
2035+
//backup old renderer
2036+
vectorRenderers.insert( vl, rendererV2->clone() );
2037+
//modify symbols of current renderer
2038+
QgsSymbolV2List symbolList = rendererV2->symbols();
2039+
QgsSymbolV2List::iterator symbolIt = symbolList.begin();
2040+
for ( ; symbolIt != symbolList.end(); ++symbolIt )
2041+
{
2042+
( *symbolIt )->setAlpha(( *symbolIt )->alpha() * lOpIt->second / 255.0 );
2043+
}
2044+
}
2045+
}
2046+
else if ( ml->type() == QgsMapLayer::RasterLayer )
2047+
{
2048+
QgsRasterLayer* rl = qobject_cast<QgsRasterLayer*>( ml );
2049+
if ( rl )
2050+
{
2051+
QgsRasterRenderer* rasterRenderer = rl->renderer();
2052+
if ( rasterRenderer )
2053+
{
2054+
rasterRenderers.insert( rl, dynamic_cast<QgsRasterRenderer*>( rasterRenderer->clone() ) );
2055+
rasterRenderer->setOpacity( opacity / 255.0 );
2056+
}
2057+
}
2058+
}
2059+
//todo: rasters
2060+
}
2061+
}
2062+
2063+
void QgsWMSServer::restoreOpacities( QHash<QgsVectorLayer*, QgsFeatureRendererV2*>& vectorRenderers, QHash < QgsRasterLayer*,
2064+
QgsRasterRenderer* > & rasterRenderers )
2065+
{
2066+
QHash<QgsVectorLayer*, QgsFeatureRendererV2*>::iterator vIt = vectorRenderers.begin();
2067+
for ( ; vIt != vectorRenderers.end(); ++vIt )
2068+
{
2069+
vIt.key()->setRendererV2( vIt.value() );
2070+
}
2071+
2072+
QHash< QgsRasterLayer*, QgsRasterRenderer* >::iterator rIt = rasterRenderers.begin();
2073+
for ( ; rIt != rasterRenderers.end(); ++rIt )
2074+
{
2075+
if ( rIt.key() )
2076+
{
2077+
rIt.key()->setRenderer( rIt.value() );
2078+
}
2079+
}
2080+
}
2081+
19812082
bool QgsWMSServer::checkMaximumWidthHeight() const
19822083
{
19832084
//test if maxWidth / maxHeight set and WIDTH / HEIGHT parameter is in the range

src/mapserver/qgswmsserver.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define QGSWMSSERVER_H
2020

2121
#include <QDomDocument>
22+
#include <QHash>
2223
#include <QMap>
2324
#include <QString>
2425
#include <map>
@@ -28,10 +29,12 @@ class QgsComposerLayerItem;
2829
class QgsComposerLegendItem;
2930
class QgsComposition;
3031
class QgsConfigParser;
32+
class QgsFeatureRendererV2;
3133
class QgsMapLayer;
3234
class QgsMapRenderer;
3335
class QgsPoint;
3436
class QgsRasterLayer;
37+
class QgsRasterRenderer;
3538
class QgsRectangle;
3639
class QgsRenderContext;
3740
class QgsVectorLayer;
@@ -164,6 +167,12 @@ class QgsWMSServer
164167
/**Clear all feature selections in the given layers*/
165168
void clearFeatureSelections( const QStringList& layerIds ) const;
166169

170+
void applyOpacities( const QStringList& layerList, QHash<QgsVectorLayer*, QgsFeatureRendererV2*>& vectorRenderers,
171+
QHash< QgsRasterLayer*, QgsRasterRenderer* >& rasterRenderers );
172+
173+
void restoreOpacities( QHash<QgsVectorLayer*, QgsFeatureRendererV2*>& vectorRenderers,
174+
QHash< QgsRasterLayer*, QgsRasterRenderer* >& rasterRenderers );
175+
167176
void appendFormats( QDomDocument &doc, QDomElement &elem, const QStringList &formats );
168177

169178
/**Checks WIDTH/HEIGHT values agains MaxWidth and MaxHeight

0 commit comments

Comments
 (0)