Skip to content

Commit 7f8768a

Browse files
committed
Merge branch 'wms_layer_opacity'
2 parents e5dae02 + dd1d4b5 commit 7f8768a

File tree

2 files changed

+130
-0
lines changed

2 files changed

+130
-0
lines changed

src/mapserver/qgswmsserver.cpp

Lines changed: 118 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,20 @@ QImage* QgsWMSServer::getMap()
613614
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
614615
QStringList selectedLayerIdList = applyFeatureSelections( layersList );
615616

617+
QList< QPair< QgsVectorLayer*, QgsFeatureRendererV2*> > bkVectorRenderers;
618+
QList< QPair< QgsRasterLayer*, QgsRasterRenderer* > > bkRasterRenderers;
619+
QList< QPair< QgsVectorLayer*, unsigned int> > bkVectorOld;
620+
621+
applyOpacities( layersList, bkVectorRenderers, bkVectorOld, bkRasterRenderers );
622+
616623
mMapRenderer->render( &thePainter );
617624
if ( mConfigParser )
618625
{
619626
//draw configuration format specific overlay items
620627
mConfigParser->drawOverlays( &thePainter, theImage->dotsPerMeterX() / 1000.0 * 25.4, theImage->width(), theImage->height() );
621628
}
622629

630+
restoreOpacities( bkVectorRenderers, bkVectorOld, bkRasterRenderers );
623631
restoreLayerFilters( originalLayerFilters );
624632
clearFeatureSelections( selectedLayerIdList );
625633

@@ -1978,6 +1986,116 @@ void QgsWMSServer::clearFeatureSelections( const QStringList& layerIds ) const
19781986
return;
19791987
}
19801988

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

src/mapserver/qgswmsserver.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include <QDomDocument>
2222
#include <QMap>
23+
#include <QPair>
2324
#include <QString>
2425
#include <map>
2526

@@ -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,15 @@ class QgsWMSServer
164167
/**Clear all feature selections in the given layers*/
165168
void clearFeatureSelections( const QStringList& layerIds ) const;
166169

170+
/**Applies opacity on layer/group level*/
171+
void applyOpacities( const QStringList& layerList, QList< QPair< QgsVectorLayer*, QgsFeatureRendererV2*> >& vectorRenderers,
172+
QList< QPair< QgsVectorLayer*, unsigned int> >& vectorOld,
173+
QList< QPair< QgsRasterLayer*, QgsRasterRenderer* > >& rasterRenderers );
174+
175+
/**Restore original opacities*/
176+
void restoreOpacities( QList< QPair <QgsVectorLayer*, QgsFeatureRendererV2*> >& vectorRenderers, QList< QPair <QgsVectorLayer*, unsigned int> >& vectorOld,
177+
QList< QPair < QgsRasterLayer*, QgsRasterRenderer* > >& rasterRenderers );
178+
167179
void appendFormats( QDomDocument &doc, QDomElement &elem, const QStringList &formats );
168180

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

0 commit comments

Comments
 (0)