Skip to content

Commit ba14e14

Browse files
committed
Add basic support for hit test without calling getMap
1 parent f482ddf commit ba14e14

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

src/server/services/wms/qgswmsgetlegendgraphics.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,33 @@ namespace QgsWms
127127
throw QgsBadRequestException( QgsServiceException::QGIS_INVALID_PARAMETER_VALUE,
128128
QStringLiteral( "BBOX parameter cannot be combined with RULE." ) );
129129
}
130+
131+
if ( ! parameters.bbox().isEmpty() && parameters.bboxAsRectangle().isEmpty() )
132+
{
133+
throw QgsBadRequestException( QgsServiceException::QGIS_INVALID_PARAMETER_VALUE,
134+
parameters[QgsWmsParameter::BBOX] );
135+
}
130136
}
131137

132138
QgsLayerTreeModel *legendModel( const QgsWmsRenderContext &context, QgsLayerTree &tree )
133139
{
134140
const QgsWmsParameters parameters = context.parameters();
135-
136141
std::unique_ptr<QgsLayerTreeModel> model( new QgsLayerTreeModel( &tree ) );
142+
143+
if ( context.scaleDenominator() > 0 )
144+
{
145+
model->setLegendFilterByScale( context.scaleDenominator() );
146+
}
147+
148+
// content based legend
149+
if ( ! parameters.bbox().isEmpty() )
150+
{
151+
QgsRenderer renderer( context );
152+
const QgsRenderer::HitTest symbols = renderer.symbols();
153+
154+
// TODO
155+
}
156+
137157
return model.release();
138158
}
139159

src/server/services/wms/qgswmsrenderer.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,36 @@ namespace QgsWms
249249
r->stopRender( context );
250250
}
251251

252+
QgsRenderer::HitTest QgsRenderer::symbols()
253+
{
254+
// check size
255+
checkMaximumWidthHeight();
256+
257+
// init layer restorer before doing anything
258+
std::unique_ptr<QgsLayerRestorer> restorer;
259+
restorer.reset( new QgsLayerRestorer( mContext.layers() ) );
260+
261+
// configure layers
262+
QgsMapSettings mapSettings;
263+
QList<QgsMapLayer *> layers = mContext.layersToRender();
264+
configureLayers( layers, &mapSettings );
265+
266+
// create the output image and the painter
267+
std::unique_ptr<QPainter> painter;
268+
std::unique_ptr<QImage> image( createImage() );
269+
270+
// configure map settings (background, DPI, ...)
271+
configureMapSettings( image.get(), mapSettings );
272+
273+
// add layers to map settings
274+
mapSettings.setLayers( layers );
275+
276+
// run hit tests
277+
HitTest symbols;
278+
runHitTest( mapSettings, symbols );
279+
280+
return symbols;
281+
}
252282

253283
QByteArray QgsRenderer::getPrint()
254284
{
@@ -385,7 +415,7 @@ namespace QgsWms
385415
std::unique_ptr<QImage> image( new QImage() );
386416
configureMapSettings( image.get(), mapSettings );
387417

388-
// add layers to map settings (revert order for the rendering)
418+
// add layers to map settings
389419
mapSettings.setLayers( layers );
390420

391421
// configure layout
@@ -751,7 +781,7 @@ namespace QgsWms
751781
// configure map settings (background, DPI, ...)
752782
configureMapSettings( image.get(), mapSettings );
753783

754-
// add layers to map settings (revert order for the rendering)
784+
// add layers to map settings
755785
mapSettings.setLayers( layers );
756786

757787
// rendering step for layers

src/server/services/wms/qgswmsrenderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ namespace QgsWms
8383
typedef QSet<QString> SymbolSet;
8484
typedef QHash<QgsVectorLayer *, SymbolSet> HitTest;
8585

86+
HitTest symbols();
87+
8688
/**
8789
* Returns the map as an image (or NULLPTR in case of error). The caller takes ownership
8890
of the image object). If an instance to existing hit test structure is passed, instead of rendering

0 commit comments

Comments
 (0)