diff --git a/src/server/services/wms/qgswmsparameters.cpp b/src/server/services/wms/qgswmsparameters.cpp index fcc14f85453f..04d33e725f53 100644 --- a/src/server/services/wms/qgswmsparameters.cpp +++ b/src/server/services/wms/qgswmsparameters.cpp @@ -1482,21 +1482,66 @@ namespace QgsWms } //layers - QList parameters; - QStringList layers = composerMapParamToStringList( mapId, "LAYERS", ',' ); - QStringList styles = composerMapParamToStringList( mapId, "STYLES", ',' ); + QList lParams; + QStringList layers = composerMapParamToStringList( mapId, name( ParameterName::LAYERS ), ',' ); + QStringList styles = composerMapParamToStringList( mapId, name( ParameterName::STYLES ), ',' ); for ( int i = 0; i < layers.size(); i++ ) { QString layer = layers[i]; - QgsWmsParametersLayer param; - param.mNickname = layer; + QgsWmsParametersLayer lParam; + lParam.mNickname = layer; if ( i < styles.count() ) - param.mStyle = styles[i]; + lParam.mStyle = styles[i]; - parameters.append( param ); + lParams.append( lParam ); + } + param.mLayers = lParams; + + //highlight layers + QList hParams; + QList geoms = composerMapParamToGeomList( mapId, name( ParameterName::HIGHLIGHT_GEOM ), ';' ); + QStringList slds = composerMapParamToStringList( mapId, name( ParameterName::HIGHLIGHT_SYMBOL ), ';' ); + QStringList labels = composerMapParamToStringList( mapId, name( ParameterName::HIGHLIGHT_LABELSTRING ), ';' ); + QList colors = composerMapParamToColorList( mapId, name( ParameterName::HIGHLIGHT_LABELCOLOR ), ';' ); + QList sizes = composerMapParamToIntList( mapId, name( ParameterName::HIGHLIGHT_LABELSIZE ), ';' ); + QList weights = composerMapParamToIntList( mapId, name( ParameterName::HIGHLIGHT_LABELWEIGHT ), ';' ); + QStringList fonts = composerMapParamToStringList( mapId, name( ParameterName::HIGHLIGHT_LABELFONT ), ';' ); + QList bufferColors = composerMapParamToColorList( mapId, name( ParameterName::HIGHLIGHT_LABELBUFFERCOLOR ), ';' ); + QList bufferSizes = composerMapParamToFloatList( mapId, name( ParameterName::HIGHLIGHT_LABELBUFFERSIZE ), ';' ); + + int nHLayers = qMin( geoms.size(), slds.size() ); + for ( int i = 0; i < nHLayers; i++ ) + { + QgsWmsParametersHighlightLayer hParam; + hParam.mName = pMapId + "_highlight_" + QString::number( i ); + hParam.mGeom = geoms[i]; + hParam.mSld = slds[i]; + + if ( i < labels.count() ) + hParam.mLabel = labels[i]; + + if ( i < colors.count() ) + hParam.mColor = colors[i]; + + if ( i < sizes.count() ) + hParam.mSize = sizes[i]; + + if ( i < weights.count() ) + hParam.mWeight = weights[i]; + + if ( i < fonts.count() ) + hParam.mFont = fonts[ i ]; + + if ( i < bufferColors.count() ) + hParam.mBufferColor = bufferColors[i]; + + if ( i < bufferSizes.count() ) + hParam.mBufferSize = bufferSizes[i]; + + hParams.append( hParam ); } - param.mLayers = parameters; + param.mHighlightLayers = hParams; return param; } @@ -1545,6 +1590,112 @@ namespace QgsWms return valStr.split( delimiter, QString::SkipEmptyParts ); } + QList QgsWmsParameters::composerMapParamToGeomList( int mapId, QString name, char delimiter ) const + { + QStringList l = composerMapParamToStringList( mapId, name, delimiter ); + QList geometries; + + Q_FOREACH ( QString wkt, l ) + { + QgsGeometry g( QgsGeometry::fromWkt( wkt ) ); + + if ( g.isGeosValid() ) + { + geometries.append( g ); + } + else + { + QString pMapId = "MAP" + QString::number( mapId ); + QString paramName = pMapId + ":" + name; + QString valStr = l.join( delimiter ); + QString msg = paramName + " ('" + valStr + "') cannot be converted into a list of geometries"; + raiseError( msg ); + } + } + + return geometries; + } + + QList QgsWmsParameters::composerMapParamToColorList( int mapId, QString name, char delimiter ) const + { + QStringList l = composerMapParamToStringList( mapId, name, delimiter ); + QList elements; + + Q_FOREACH ( QString element, l ) + { + QColor c = QColor( element ); + + if ( c.isValid() ) + { + elements.append( c ); + } + else + { + QString pMapId = "MAP" + QString::number( mapId ); + QString paramName = pMapId + ":" + name; + QString valStr = l.join( delimiter ); + QString msg = paramName + " ('" + valStr + "') cannot be converted into a list of colors"; + raiseError( msg ); + } + } + + return elements; + } + + QList QgsWmsParameters::composerMapParamToIntList( int mapId, QString name, char delimiter ) const + { + QStringList l = composerMapParamToStringList( mapId, name, delimiter ); + QList elements; + + Q_FOREACH ( QString element, l ) + { + bool ok; + int e = element.toInt( &ok ); + + if ( ok ) + { + elements.append( e ); + } + else + { + QString pMapId = "MAP" + QString::number( mapId ); + QString paramName = pMapId + ":" + name; + QString valStr = l.join( delimiter ); + QString msg = paramName + " ('" + valStr + "') cannot be converted into a list of int"; + raiseError( msg ); + } + } + + return elements; + } + + QList QgsWmsParameters::composerMapParamToFloatList( int mapId, QString name, char delimiter ) const + { + QStringList l = composerMapParamToStringList( mapId, name, delimiter ); + QList elements; + + Q_FOREACH ( QString element, l ) + { + bool ok; + float e = element.toFloat( &ok ); + + if ( ok ) + { + elements.append( e ); + } + else + { + QString pMapId = "MAP" + QString::number( mapId ); + QString paramName = pMapId + ":" + name; + QString valStr = l.join( delimiter ); + QString msg = paramName + " ('" + valStr + "') cannot be converted into a list of float"; + raiseError( msg ); + } + } + + return elements; + } + QString QgsWmsParameters::name( ParameterName name ) const { const QMetaEnum metaEnum( QMetaEnum::fromType() ); diff --git a/src/server/services/wms/qgswmsparameters.h b/src/server/services/wms/qgswmsparameters.h index 4aa95440a998..aeee6ef8d476 100644 --- a/src/server/services/wms/qgswmsparameters.h +++ b/src/server/services/wms/qgswmsparameters.h @@ -69,6 +69,7 @@ namespace QgsWms float mGridX = 0; float mGridY = 0; QList mLayers; // list of layers fr this composer map + QList mHighlightLayers; // list of highlight layers fr this composer map }; class QgsWmsParameters @@ -810,6 +811,10 @@ namespace QgsWms * \returns parameter as a string list */ QStringList composerMapParamToStringList( int mapId, QString name, char delimiter ) const; + QList composerMapParamToGeomList( int mapId, QString name, char delimiter ) const; + QList composerMapParamToColorList( int mapId, QString name, char delimiter ) const; + QList composerMapParamToIntList( int mapId, QString name, char delimiter ) const; + QList composerMapParamToFloatList( int mapId, QString name, char delimiter ) const; private: QString name( ParameterName name ) const; diff --git a/src/server/services/wms/qgswmsrenderer.cpp b/src/server/services/wms/qgswmsrenderer.cpp index 5fce9a970a3c..e404b53451da 100644 --- a/src/server/services/wms/qgswmsrenderer.cpp +++ b/src/server/services/wms/qgswmsrenderer.cpp @@ -349,7 +349,7 @@ namespace QgsWms } // add highlight layers above others - layers = layers << highlightLayers(); + layers = layers << highlightLayers( mWmsParameters.highlightLayersParameters() ); // add layers to map settings (revert order for the rendering) std::reverse( layers.begin(), layers.end() ); @@ -523,6 +523,7 @@ namespace QgsWms QStringLiteral( "Layer \"%1\" does not exist" ).arg( nickname ) ); } } + layerSet << highlightLayers( cMapParams.mHighlightLayers ); std::reverse( layerSet.begin(), layerSet.end() ); map->setLayers( layerSet ); } @@ -754,7 +755,7 @@ namespace QgsWms } // add highlight layers above others - layers = layers << highlightLayers(); + layers = layers << highlightLayers( mWmsParameters.highlightLayersParameters() ); // create the output image and the painter std::unique_ptr painter; @@ -2871,12 +2872,11 @@ namespace QgsWms return visible; } - QList QgsRenderer::highlightLayers() + QList QgsRenderer::highlightLayers( QList params ) { QList highlightLayers; // try to create highlight layer for each geometry - QList params = mWmsParameters.highlightLayersParameters(); QString crs = mWmsParameters.crs(); Q_FOREACH ( QgsWmsParametersHighlightLayer param, params ) { diff --git a/src/server/services/wms/qgswmsrenderer.h b/src/server/services/wms/qgswmsrenderer.h index b93263834cf3..462b91fc08b2 100644 --- a/src/server/services/wms/qgswmsrenderer.h +++ b/src/server/services/wms/qgswmsrenderer.h @@ -124,7 +124,7 @@ namespace QgsWms void initRestrictedLayers(); // Build and returns highlight layers - QList highlightLayers(); + QList highlightLayers( QList params ); // Init a map with nickname for layers' project void initNicknameLayers();