Skip to content

Commit 4d4d229

Browse files
committedApr 9, 2019
Use new getLegendGraphics methods
1 parent 81f029d commit 4d4d229

File tree

6 files changed

+171
-12
lines changed

6 files changed

+171
-12
lines changed
 

‎src/core/layertree/qgslayertreelayer.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,12 @@ void QgsLayerTreeLayer::attachToLayer()
7676

7777
QString QgsLayerTreeLayer::name() const
7878
{
79-
return mRef ? mRef->name() : mLayerName;
79+
return ( mRef && mUseLayerName ) ? mRef->name() : mLayerName;
8080
}
8181

8282
void QgsLayerTreeLayer::setName( const QString &n )
8383
{
84-
if ( mRef )
84+
if ( mRef && mUseLayerName )
8585
{
8686
if ( mRef->name() == n )
8787
return;
@@ -173,6 +173,15 @@ void QgsLayerTreeLayer::layerWillBeDeleted()
173173

174174
}
175175

176+
void QgsLayerTreeLayer::setUseLayerName( const bool use )
177+
{
178+
mUseLayerName = use;
179+
}
180+
181+
bool QgsLayerTreeLayer::useLayerName() const
182+
{
183+
return mUseLayerName;
184+
}
176185

177186
void QgsLayerTreeLayer::layerNameChanged()
178187
{

‎src/core/layertree/qgslayertreelayer.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class CORE_EXPORT QgsLayerTreeLayer : public QgsLayerTreeNode
9090
*/
9191
void setName( const QString &n ) override;
9292

93+
void setUseLayerName( bool use = true );
94+
95+
bool useLayerName() const;
96+
9397
/**
9498
* Read layer node from XML. Returns new instance.
9599
* Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.
@@ -133,9 +137,12 @@ class CORE_EXPORT QgsLayerTreeLayer : public QgsLayerTreeNode
133137

134138
//! Weak reference to the layer (or just it's ID if the reference is not resolved yet)
135139
QgsMapLayerRef mRef;
136-
//! Layer name - only used if layer does not exist
140+
//! Layer name - only used if layer does not exist or if mUseLayerName is false
137141
QString mLayerName;
138142

143+
//!
144+
bool mUseLayerName = true;
145+
139146
private slots:
140147

141148
/**

‎src/server/services/wms/qgswmsgetlegendgraphics.cpp

Lines changed: 59 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include "qgslegendrenderer.h"
2323
#include "qgsvectorlayer.h"
2424
#include "qgsvectorlayerfeaturecounter.h"
25+
#include "qgssymbollayerutils.h"
26+
#include "qgsmaplayerlegend.h"
2527

2628
#include "qgswmsutils.h"
2729
#include "qgswmsserviceexception.h"
@@ -89,7 +91,25 @@ namespace QgsWms
8991
#endif
9092
QgsRenderer renderer( context );
9193

92-
std::unique_ptr<QImage> result( renderer.getLegendGraphics() );
94+
// retrieve legend settings and model
95+
std::unique_ptr<QgsLayerTree> tree( layerTree( context ) );
96+
std::unique_ptr<QgsLayerTreeModel> model( legendModel( context, *tree.get() ) );
97+
98+
// rendering
99+
QgsRenderer renderer( context );
100+
101+
std::unique_ptr<QImage> result;
102+
if ( !parameters.rule().isEmpty() )
103+
{
104+
QgsLayerTreeModelLegendNode *node = legendNode( parameters.rule(), *model.get() );
105+
result.reset( renderer.getLegendGraphics( *node ) );
106+
}
107+
else
108+
{
109+
result.reset( renderer.getLegendGraphics( *model.get() ) );
110+
}
111+
112+
tree->clear();
93113

94114
if ( result )
95115
{
@@ -152,7 +172,38 @@ namespace QgsWms
152172
QgsRenderer renderer( context );
153173
const QgsRenderer::HitTest symbols = renderer.symbols();
154174

155-
// TODO
175+
for ( QgsLayerTreeNode *node : tree.children() )
176+
{
177+
QgsLayerTreeLayer *layer = QgsLayerTree::toLayer( node );
178+
179+
QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer->layer() );
180+
if ( !vl || !vl->renderer() )
181+
continue;
182+
183+
QList<int> order;
184+
int i = 0;
185+
186+
for ( const QgsLegendSymbolItem &item : vl->renderer()->legendSymbolItems() )
187+
{
188+
const QString prop = QgsSymbolLayerUtils::symbolProperties( item.legacyRuleKey() );
189+
if ( symbols[vl].contains( prop ) )
190+
{
191+
order.append( i );
192+
}
193+
++i;
194+
}
195+
196+
// either remove the whole layer or just filter out some items
197+
if ( order.isEmpty() )
198+
{
199+
tree.removeChildNode( layer );
200+
}
201+
else
202+
{
203+
QgsMapLayerLegendUtils::setLegendNodeOrder( layer, order );
204+
model->refreshLayerLegend( layer );
205+
}
206+
}
156207
}
157208

158209
// if legend is not based on rendering rules
@@ -194,18 +245,19 @@ namespace QgsWms
194245

195246
QgsLayerTree *layerTree( const QgsWmsRenderContext &context )
196247
{
197-
std::unique_ptr<QgsLayerTree> tree;
248+
std::unique_ptr<QgsLayerTree> tree( new QgsLayerTree() );
198249

199250
QList<QgsVectorLayerFeatureCounter *> counters;
200251
for ( QgsMapLayer *ml : context.layersToRender() )
201252
{
202253
QgsLayerTreeLayer *lt = tree->addLayer( ml );
254+
lt->setUseLayerName( false ); // do not modify underlying layer
203255

204256
// name
205257
if ( !ml->title().isEmpty() )
206258
lt->setName( ml->title() );
207259

208-
//show feature count
260+
// show feature count
209261
const bool showFeatureCount = context.parameters().showFeatureCountAsBool();
210262
const QString property = QStringLiteral( "showFeatureCount" );
211263
lt->setCustomProperty( property, showFeatureCount );
@@ -229,11 +281,11 @@ namespace QgsWms
229281
return tree.release();
230282
}
231283

232-
QgsLayerTreeModelLegendNode *legendNode( const QgsLayerTreeModel &model, const QString &rule )
284+
QgsLayerTreeModelLegendNode *legendNode( const QString &rule, QgsLayerTreeModel &model )
233285
{
234-
for ( QgsLayerTreeLayer *layer : model->rootGroup()->findLayers() )
286+
for ( QgsLayerTreeLayer *layer : model.rootGroup()->findLayers() )
235287
{
236-
for ( QgsLayerTreeModelLegendNode *node : model->layerLegendNodes( layer ) )
288+
for ( QgsLayerTreeModelLegendNode *node : model.layerLegendNodes( layer ) )
237289
{
238290
if ( node->data( Qt::DisplayRole ).toString().compare( rule ) == 0 )
239291
return node;

‎src/server/services/wms/qgswmsgetlegendgraphics.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ namespace QgsWms
3838

3939
QgsLayerTree *layerTree( const QgsWmsRenderContext &context );
4040

41-
QgsLayerTreeModelLegendNode *legendNode( const QgsLayerTreeModel &model, const QString &rule );
41+
QgsLayerTreeModelLegendNode *legendNode( const QString &rule, QgsLayerTreeModel &model );
4242
} // namespace QgsWms

‎src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#include "qgsmapserviceexception.h"
3232
#include "qgslayertree.h"
3333
#include "qgslayertreemodel.h"
34-
#include "qgslayertreemodellegendnode.h"
3534
#include "qgslegendrenderer.h"
3635
#include "qgsmaplayer.h"
3736
#include "qgsmaplayerlegend.h"
@@ -201,6 +200,93 @@ namespace QgsWms
201200
return image.release();
202201
}
203202

203+
QImage *QgsRenderer::getLegendGraphics( QgsLayerTreeModel &model )
204+
{
205+
// get layers
206+
std::unique_ptr<QgsLayerRestorer> restorer;
207+
restorer.reset( new QgsLayerRestorer( mContext.layers() ) );
208+
209+
// configure layers
210+
QList<QgsMapLayer *> layers = mContext.layersToRender();
211+
configureLayers( layers );
212+
213+
// getting scale from bbox
214+
QgsLegendSettings settings = mWmsParameters.legendSettings();
215+
if ( !mWmsParameters.bbox().isEmpty() )
216+
{
217+
QgsMapSettings mapSettings;
218+
std::unique_ptr<QImage> tmp( createImage( width(), height(), false ) );
219+
configureMapSettings( tmp.get(), mapSettings );
220+
settings.setMapScale( mapSettings.scale() );
221+
settings.setMapUnitsPerPixel( mapSettings.mapUnitsPerPixel() );
222+
}
223+
224+
// init renderer
225+
QgsLegendRenderer renderer( &model, settings );
226+
227+
// create image
228+
std::unique_ptr<QImage> image;
229+
const qreal dpmm = mContext.dotsPerMm();
230+
const QSizeF minSize = renderer.minimumSize();
231+
const QSize size( minSize.width() * dpmm, minSize.height() * dpmm );
232+
image.reset( createImage( size.width(), size.height(), false ) );
233+
234+
// configure painter
235+
std::unique_ptr<QPainter> painter;
236+
painter.reset( new QPainter( image.get() ) );
237+
painter->setRenderHint( QPainter::Antialiasing, true );
238+
painter->scale( dpmm, dpmm );
239+
240+
// rendering
241+
renderer.drawLegend( painter.get() );
242+
painter->end();
243+
244+
return image.release();
245+
}
246+
247+
QImage *QgsRenderer::getLegendGraphics( QgsLayerTreeModelLegendNode &node )
248+
{
249+
// get layers
250+
std::unique_ptr<QgsLayerRestorer> restorer;
251+
restorer.reset( new QgsLayerRestorer( mContext.layers() ) );
252+
253+
// configure layers
254+
QList<QgsMapLayer *> layers = mContext.layersToRender();
255+
configureLayers( layers );
256+
257+
// getting scale from bbox
258+
QgsLegendSettings settings = mWmsParameters.legendSettings();
259+
if ( !mWmsParameters.bbox().isEmpty() )
260+
{
261+
QgsMapSettings mapSettings;
262+
std::unique_ptr<QImage> tmp( createImage( width(), height(), false ) );
263+
configureMapSettings( tmp.get(), mapSettings );
264+
settings.setMapScale( mapSettings.scale() );
265+
settings.setMapUnitsPerPixel( mapSettings.mapUnitsPerPixel() );
266+
}
267+
268+
// create image
269+
const int width = mWmsParameters.widthAsInt();
270+
const int height = mWmsParameters.heightAsInt();
271+
std::unique_ptr<QImage> image( createImage( width, height, false ) );
272+
273+
// configure painter
274+
const qreal dpmm = mContext.dotsPerMm();
275+
std::unique_ptr<QPainter> painter;
276+
painter.reset( new QPainter( image.get() ) );
277+
painter->setRenderHint( QPainter::Antialiasing, true );
278+
painter->scale( dpmm, dpmm );
279+
280+
// rendering
281+
QgsLayerTreeModelLegendNode::ItemContext ctx;
282+
ctx.painter = painter.get();
283+
ctx.labelXOffset = 0;
284+
ctx.point = QPointF();
285+
node.drawSymbol( settings, &ctx, height / dpmm );
286+
painter->end();
287+
288+
return image.release();
289+
}
204290
void QgsRenderer::runHitTest( const QgsMapSettings &mapSettings, HitTest &hitTest ) const
205291
{
206292
QgsRenderContext context = QgsRenderContext::fromMapSettings( mapSettings );

‎src/server/services/wms/qgswmsrenderer.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgswmsparameters.h"
2525
#include "qgswmsrendercontext.h"
2626
#include "qgsfeaturefilter.h"
27+
#include "qgslayertreemodellegendnode.h"
2728
#include <QDomDocument>
2829
#include <QMap>
2930
#include <QString>
@@ -80,6 +81,10 @@ namespace QgsWms
8081
of the image object*/
8182
QImage *getLegendGraphics();
8283

84+
QImage *getLegendGraphics( QgsLayerTreeModel &model );
85+
86+
QImage *getLegendGraphics( QgsLayerTreeModelLegendNode &node );
87+
8388
typedef QSet<QString> SymbolSet;
8489
typedef QHash<QgsVectorLayer *, SymbolSet> HitTest;
8590

0 commit comments

Comments
 (0)
Please sign in to comment.