|
14 | 14 | * (at your option) any later version. *
|
15 | 15 | * *
|
16 | 16 | ***************************************************************************/
|
| 17 | + |
17 | 18 | #include "qgswmsserver.h"
|
18 | 19 | #include "qgsconfigparser.h"
|
19 | 20 | #include "qgscrscache.h"
|
@@ -613,13 +614,20 @@ QImage* QgsWMSServer::getMap()
|
613 | 614 | QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
|
614 | 615 | QStringList selectedLayerIdList = applyFeatureSelections( layersList );
|
615 | 616 |
|
| 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 | + |
616 | 623 | mMapRenderer->render( &thePainter );
|
617 | 624 | if ( mConfigParser )
|
618 | 625 | {
|
619 | 626 | //draw configuration format specific overlay items
|
620 | 627 | mConfigParser->drawOverlays( &thePainter, theImage->dotsPerMeterX() / 1000.0 * 25.4, theImage->width(), theImage->height() );
|
621 | 628 | }
|
622 | 629 |
|
| 630 | + restoreOpacities( bkVectorRenderers, bkVectorOld, bkRasterRenderers ); |
623 | 631 | restoreLayerFilters( originalLayerFilters );
|
624 | 632 | clearFeatureSelections( selectedLayerIdList );
|
625 | 633 |
|
@@ -1978,6 +1986,116 @@ void QgsWMSServer::clearFeatureSelections( const QStringList& layerIds ) const
|
1978 | 1986 | return;
|
1979 | 1987 | }
|
1980 | 1988 |
|
| 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 | + |
1981 | 2099 | bool QgsWMSServer::checkMaximumWidthHeight() const
|
1982 | 2100 | {
|
1983 | 2101 | //test if maxWidth / maxHeight set and WIDTH / HEIGHT parameter is in the range
|
|
0 commit comments