|
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,18 @@ QImage* QgsWMSServer::getMap() |
613 | 614 | QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList ); |
614 | 615 | QStringList selectedLayerIdList = applyFeatureSelections( layersList ); |
615 | 616 |
|
| 617 | + QHash<QgsVectorLayer*, QgsFeatureRendererV2*> bkVectorRenderers; |
| 618 | + QHash< QgsRasterLayer*, QgsRasterRenderer* > bkRasterRenderers; |
| 619 | + applyOpacities( layersList, bkVectorRenderers, bkRasterRenderers ); |
| 620 | + |
616 | 621 | mMapRenderer->render( &thePainter ); |
617 | 622 | if ( mConfigParser ) |
618 | 623 | { |
619 | 624 | //draw configuration format specific overlay items |
620 | 625 | mConfigParser->drawOverlays( &thePainter, theImage->dotsPerMeterX() / 1000.0 * 25.4, theImage->width(), theImage->height() ); |
621 | 626 | } |
622 | 627 |
|
| 628 | + restoreOpacities( bkVectorRenderers, bkRasterRenderers ); |
623 | 629 | restoreLayerFilters( originalLayerFilters ); |
624 | 630 | clearFeatureSelections( selectedLayerIdList ); |
625 | 631 |
|
@@ -1978,6 +1984,101 @@ void QgsWMSServer::clearFeatureSelections( const QStringList& layerIds ) const |
1978 | 1984 | return; |
1979 | 1985 | } |
1980 | 1986 |
|
| 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 | + |
1981 | 2082 | bool QgsWMSServer::checkMaximumWidthHeight() const |
1982 | 2083 | { |
1983 | 2084 | //test if maxWidth / maxHeight set and WIDTH / HEIGHT parameter is in the range |
|
0 commit comments