QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsvectortilebasicrenderer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsvectortilebasicrenderer.cpp
3 --------------------------------------
4 Date : March 2020
5 Copyright : (C) 2020 by Martin Dobias
6 Email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsapplication.h"
21#include "qgsfillsymbollayer.h"
22#include "qgslinesymbollayer.h"
24#include "qgssymbollayerutils.h"
25#include "qgsvectortileutils.h"
26#include "qgsfillsymbol.h"
27#include "qgslinesymbol.h"
28#include "qgsmarkersymbol.h"
29
31 : mStyleName( stName )
32 , mLayerName( laName )
33 , mGeometryType( geomType )
34{
35}
36
38{
39 operator=( other );
40}
41
43{
44 mStyleName = other.mStyleName;
45 mLayerName = other.mLayerName;
46 mGeometryType = other.mGeometryType;
47 mSymbol.reset( other.mSymbol ? other.mSymbol->clone() : nullptr );
48 mEnabled = other.mEnabled;
49 mExpression = other.mExpression;
50 mMinZoomLevel = other.mMinZoomLevel;
51 mMaxZoomLevel = other.mMaxZoomLevel;
52 return *this;
53}
54
56
58{
59 mSymbol.reset( sym );
60}
61
62void QgsVectorTileBasicRendererStyle::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
63{
64 elem.setAttribute( QStringLiteral( "name" ), mStyleName );
65 elem.setAttribute( QStringLiteral( "layer" ), mLayerName );
66 elem.setAttribute( QStringLiteral( "geometry" ), mGeometryType );
67 elem.setAttribute( QStringLiteral( "enabled" ), mEnabled ? QStringLiteral( "1" ) : QStringLiteral( "0" ) );
68 elem.setAttribute( QStringLiteral( "expression" ), mExpression );
69 elem.setAttribute( QStringLiteral( "min-zoom" ), mMinZoomLevel );
70 elem.setAttribute( QStringLiteral( "max-zoom" ), mMaxZoomLevel );
71
72 QDomDocument doc = elem.ownerDocument();
73 QgsSymbolMap symbols;
74 symbols[QStringLiteral( "0" )] = mSymbol.get();
75 QDomElement symbolsElem = QgsSymbolLayerUtils::saveSymbols( symbols, QStringLiteral( "symbols" ), doc, context );
76 elem.appendChild( symbolsElem );
77}
78
79void QgsVectorTileBasicRendererStyle::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
80{
81 mStyleName = elem.attribute( QStringLiteral( "name" ) );
82 mLayerName = elem.attribute( QStringLiteral( "layer" ) );
83 mGeometryType = static_cast<QgsWkbTypes::GeometryType>( elem.attribute( QStringLiteral( "geometry" ) ).toInt() );
84 mEnabled = elem.attribute( QStringLiteral( "enabled" ) ).toInt();
85 mExpression = elem.attribute( QStringLiteral( "expression" ) );
86 mMinZoomLevel = elem.attribute( QStringLiteral( "min-zoom" ) ).toInt();
87 mMaxZoomLevel = elem.attribute( QStringLiteral( "max-zoom" ) ).toInt();
88
89 mSymbol.reset();
90 QDomElement symbolsElem = elem.firstChildElement( QStringLiteral( "symbols" ) );
91 if ( !symbolsElem.isNull() )
92 {
93 QgsSymbolMap symbolMap = QgsSymbolLayerUtils::loadSymbols( symbolsElem, context );
94 if ( symbolMap.contains( QStringLiteral( "0" ) ) )
95 {
96 mSymbol.reset( symbolMap.take( QStringLiteral( "0" ) ) );
97 }
98 }
99}
100
102
103
105{
106}
107
109{
110 return QStringLiteral( "basic" );
111}
112
114{
116 r->mStyles = mStyles;
117 r->mStyles.detach(); // make a deep copy to make sure symbols get cloned
118 return r;
119}
120
121void QgsVectorTileBasicRenderer::startRender( QgsRenderContext &context, int tileZoom, const QgsTileRange &tileRange )
122{
123 Q_UNUSED( context )
124 Q_UNUSED( tileRange )
125 // figure out required fields for different layers
126 for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
127 {
128 if ( layerStyle.isActive( tileZoom ) )
129 {
130 if ( !layerStyle.filterExpression().isEmpty() )
131 {
132 QgsExpression expr( layerStyle.filterExpression() );
133 mRequiredFields[layerStyle.layerName()].unite( expr.referencedColumns() );
134 }
135 if ( auto *lSymbol = layerStyle.symbol() )
136 {
137 mRequiredFields[layerStyle.layerName()].unite( lSymbol->usedAttributes( context ) );
138 }
139 }
140 }
141}
142
143QMap<QString, QSet<QString> > QgsVectorTileBasicRenderer::usedAttributes( const QgsRenderContext & )
144{
145 return mRequiredFields;
146}
147
149{
150 QSet< QString > res;
151 for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
152 {
153 if ( layerStyle.isActive( tileZoom ) )
154 {
155 res.insert( layerStyle.layerName() );
156 }
157 }
158 return res;
159}
160
162{
163 Q_UNUSED( context )
164}
165
167{
168 const QgsVectorTileFeatures tileData = tile.features();
169 int zoomLevel = tile.id().zoomLevel();
170
171 for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
172 {
173 if ( !layerStyle.isActive( zoomLevel ) || !layerStyle.symbol() )
174 continue;
175
176 QgsExpressionContextScope *scope = new QgsExpressionContextScope( QObject::tr( "Layer" ) ); // will be deleted by popper
177 scope->setFields( tile.fields()[layerStyle.layerName()] );
178 QgsExpressionContextScopePopper popper( context.expressionContext(), scope );
179
180 QgsExpression filterExpression( layerStyle.filterExpression() );
181 filterExpression.prepare( &context.expressionContext() );
182
183 QgsSymbol *sym = layerStyle.symbol();
184 sym->startRender( context, QgsFields() );
185 if ( layerStyle.layerName() == QLatin1String( "background" ) )
186 {
187 QgsFillSymbol *fillSym = dynamic_cast<QgsFillSymbol *>( sym );
188 if ( fillSym )
189 fillSym->renderPolygon( tile.tilePolygon(), nullptr, nullptr, context );
190 }
191 else if ( layerStyle.layerName().isEmpty() )
192 {
193 // matching all layers
194 for ( QString layerName : tileData.keys() )
195 {
196 for ( const QgsFeature &f : tileData[layerName] )
197 {
198 scope->setFeature( f );
199 if ( filterExpression.isValid() && !filterExpression.evaluate( &context.expressionContext() ).toBool() )
200 continue;
201
202 const QgsWkbTypes::GeometryType featureType = QgsWkbTypes::geometryType( f.geometry().wkbType() );
203 if ( featureType == layerStyle.geometryType() )
204 {
205 sym->renderFeature( f, context );
206 }
207 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::LineGeometry )
208 {
209 // be tolerant and permit rendering polygons with a line layer style, as some style definitions use this approach
210 // to render the polygon borders only
211 QgsFeature exterior = f;
212 exterior.setGeometry( QgsGeometry( f.geometry().constGet()->boundary() ) );
213 sym->renderFeature( exterior, context );
214 }
215 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::PointGeometry )
216 {
217 // be tolerant and permit rendering polygons with a point layer style, as some style definitions use this approach
218 // to render the polygon center
220 const QgsRectangle boundingBox = f.geometry().boundingBox();
221 centroid.setGeometry( f.geometry().poleOfInaccessibility( std::min( boundingBox.width(), boundingBox.height() ) / 20 ) );
222 sym->renderFeature( centroid, context );
223 }
224 }
225 }
226 }
227 else if ( tileData.contains( layerStyle.layerName() ) )
228 {
229 // matching one particular layer
230 for ( const QgsFeature &f : tileData[layerStyle.layerName()] )
231 {
232 scope->setFeature( f );
233 if ( filterExpression.isValid() && !filterExpression.evaluate( &context.expressionContext() ).toBool() )
234 continue;
235
236 const QgsWkbTypes::GeometryType featureType = QgsWkbTypes::geometryType( f.geometry().wkbType() );
237 if ( featureType == layerStyle.geometryType() )
238 {
239 sym->renderFeature( f, context );
240 }
241 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::LineGeometry )
242 {
243 // be tolerant and permit rendering polygons with a line layer style, as some style definitions use this approach
244 // to render the polygon borders only
245 QgsFeature exterior = f;
246 exterior.setGeometry( QgsGeometry( f.geometry().constGet()->boundary() ) );
247 sym->renderFeature( exterior, context );
248 }
249 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::PointGeometry )
250 {
251 // be tolerant and permit rendering polygons with a point layer style, as some style definitions use this approach
252 // to render the polygon center
254 const QgsRectangle boundingBox = f.geometry().boundingBox();
255 centroid.setGeometry( f.geometry().poleOfInaccessibility( std::min( boundingBox.width(), boundingBox.height() ) / 20 ) );
256 sym->renderFeature( centroid, context );
257 }
258 }
259 }
260 sym->stopRender( context );
261 }
262}
263
264void QgsVectorTileBasicRenderer::renderSelectedFeatures( const QList<QgsFeature> &selection, QgsRenderContext &context )
265{
266 QgsExpressionContextScope *scope = new QgsExpressionContextScope( QObject::tr( "Layer" ) ); // will be deleted by popper
267 QgsExpressionContextScopePopper popper( context.expressionContext(), scope );
268
269 for ( const QgsFeature &feature : selection )
270 {
271 bool ok = false;
272 int featureTileZoom = feature.attribute( QStringLiteral( "tile_zoom" ) ).toInt( &ok );
273 if ( !ok )
274 featureTileZoom = -1;
275 const QString featureTileLayer = feature.attribute( QStringLiteral( "tile_layer" ) ).toString();
276
277 for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
278 {
279 if ( ( featureTileZoom >= 0 && !layerStyle.isActive( featureTileZoom ) )
280 || !layerStyle.symbol() || layerStyle.layerName() == QLatin1String( "background" ) )
281 continue;
282
283 if ( !layerStyle.layerName().isEmpty() && !featureTileLayer.isEmpty() && layerStyle.layerName() != featureTileLayer )
284 continue;
285
286 scope->setFields( feature.fields() );
287
288 QgsExpression filterExpression( layerStyle.filterExpression() );
289 filterExpression.prepare( &context.expressionContext() );
290
291 scope->setFeature( feature );
292 if ( filterExpression.isValid() && !filterExpression.evaluate( &context.expressionContext() ).toBool() )
293 continue;
294
295 QgsSymbol *sym = layerStyle.symbol();
296 sym->startRender( context, feature.fields() );
297
298 const QgsWkbTypes::GeometryType featureType = feature.geometry().type();
299 bool renderedFeature = false;
300 if ( featureType == layerStyle.geometryType() )
301 {
302 sym->renderFeature( feature, context, -1, true );
303 renderedFeature = true;
304 }
305 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::LineGeometry )
306 {
307 // be tolerant and permit rendering polygons with a line layer style, as some style definitions use this approach
308 // to render the polygon borders only
309 QgsFeature exterior = feature;
310 exterior.setGeometry( QgsGeometry( feature.geometry().constGet()->boundary() ) );
311 sym->renderFeature( exterior, context, -1, true );
312 renderedFeature = true;
313 }
314 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::PointGeometry )
315 {
316 // be tolerant and permit rendering polygons with a point layer style, as some style definitions use this approach
317 // to render the polygon center
318 QgsFeature centroid = feature;
319 const QgsRectangle boundingBox = feature.geometry().boundingBox();
320 centroid.setGeometry( feature.geometry().poleOfInaccessibility( std::min( boundingBox.width(), boundingBox.height() ) / 20 ) );
321 sym->renderFeature( centroid, context, -1, true );
322 renderedFeature = true;
323 }
324 sym->stopRender( context );
325
326 if ( renderedFeature )
327 break;
328 }
329 }
330}
331
332bool QgsVectorTileBasicRenderer::willRenderFeature( const QgsFeature &feature, int tileZoom, const QString &layerName, QgsRenderContext &context )
333{
334 QgsExpressionContextScope *scope = new QgsExpressionContextScope( QObject::tr( "Layer" ) ); // will be deleted by popper
335 scope->setFields( feature.fields() );
336 scope->setFeature( feature );
337 QgsExpressionContextScopePopper popper( context.expressionContext(), scope );
338
339 for ( const QgsVectorTileBasicRendererStyle &layerStyle : std::as_const( mStyles ) )
340 {
341 if ( !layerStyle.isActive( tileZoom ) || !layerStyle.symbol() )
342 continue;
343
344 if ( layerStyle.layerName() == QLatin1String( "background" ) )
345 continue;
346
347 if ( !layerStyle.layerName().isEmpty() && layerStyle.layerName() != layerName )
348 continue;
349
350 QgsExpression filterExpression( layerStyle.filterExpression() );
351 filterExpression.prepare( &context.expressionContext() );
352
353 if ( filterExpression.isValid() && !filterExpression.evaluate( &context.expressionContext() ).toBool() )
354 continue;
355
356 const QgsWkbTypes::GeometryType featureType = QgsWkbTypes::geometryType( feature.geometry().wkbType() );
357 if ( featureType == layerStyle.geometryType() )
358 {
359 return true;
360 }
361 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::LineGeometry )
362 {
363 // be tolerant and permit rendering polygons with a line layer style, as some style definitions use this approach
364 // to render the polygon borders only
365 return true;
366 }
367 else if ( featureType == QgsWkbTypes::PolygonGeometry && layerStyle.geometryType() == QgsWkbTypes::PointGeometry )
368 {
369 // be tolerant and permit rendering polygons with a point layer style, as some style definitions use this approach
370 // to render the polygon center
371 return true;
372 }
373 }
374 return false;
375}
376
377void QgsVectorTileBasicRenderer::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
378{
379 QDomDocument doc = elem.ownerDocument();
380 QDomElement elemStyles = doc.createElement( QStringLiteral( "styles" ) );
381 for ( const QgsVectorTileBasicRendererStyle &layerStyle : mStyles )
382 {
383 QDomElement elemStyle = doc.createElement( QStringLiteral( "style" ) );
384 layerStyle.writeXml( elemStyle, context );
385 elemStyles.appendChild( elemStyle );
386 }
387 elem.appendChild( elemStyles );
388}
389
390void QgsVectorTileBasicRenderer::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
391{
392 mStyles.clear();
393
394 QDomElement elemStyles = elem.firstChildElement( QStringLiteral( "styles" ) );
395 QDomElement elemStyle = elemStyles.firstChildElement( QStringLiteral( "style" ) );
396 while ( !elemStyle.isNull() )
397 {
399 layerStyle.readXml( elemStyle, context );
400 mStyles.append( layerStyle );
401 elemStyle = elemStyle.nextSiblingElement( QStringLiteral( "style" ) );
402 }
403}
404
405void QgsVectorTileBasicRenderer::setStyles( const QList<QgsVectorTileBasicRendererStyle> &styles )
406{
407 mStyles = styles;
408}
409
410QList<QgsVectorTileBasicRendererStyle> QgsVectorTileBasicRenderer::styles() const
411{
412 return mStyles;
413}
414
415QList<QgsVectorTileBasicRendererStyle> QgsVectorTileBasicRenderer::simpleStyleWithRandomColors()
416{
417 QColor polygonFillColor = QgsApplication::colorSchemeRegistry()->fetchRandomStyleColor();
418 QColor polygonStrokeColor = polygonFillColor;
419 polygonFillColor.setAlpha( 100 );
420 double polygonStrokeWidth = DEFAULT_LINE_WIDTH;
421
423 double lineStrokeWidth = DEFAULT_LINE_WIDTH;
424
426 QColor pointStrokeColor = pointFillColor;
427 pointFillColor.setAlpha( 100 );
428 double pointSize = DEFAULT_POINT_SIZE;
429
430 return simpleStyle( polygonFillColor, polygonStrokeColor, polygonStrokeWidth,
431 lineStrokeColor, lineStrokeWidth,
432 pointFillColor, pointStrokeColor, pointSize );
433}
434
435QList<QgsVectorTileBasicRendererStyle> QgsVectorTileBasicRenderer::simpleStyle(
436 const QColor &polygonFillColor, const QColor &polygonStrokeColor, double polygonStrokeWidth,
437 const QColor &lineStrokeColor, double lineStrokeWidth,
438 const QColor &pointFillColor, const QColor &pointStrokeColor, double pointSize )
439{
440 QgsSimpleFillSymbolLayer *fillSymbolLayer = new QgsSimpleFillSymbolLayer();
441 fillSymbolLayer->setFillColor( polygonFillColor );
442 fillSymbolLayer->setStrokeColor( polygonStrokeColor );
443 fillSymbolLayer->setStrokeWidth( polygonStrokeWidth );
444 QgsFillSymbol *fillSymbol = new QgsFillSymbol( QgsSymbolLayerList() << fillSymbolLayer );
445
447 lineSymbolLayer->setColor( lineStrokeColor );
448 lineSymbolLayer->setWidth( lineStrokeWidth );
449 QgsLineSymbol *lineSymbol = new QgsLineSymbol( QgsSymbolLayerList() << lineSymbolLayer );
450
452 markerSymbolLayer->setFillColor( pointFillColor );
453 markerSymbolLayer->setStrokeColor( pointStrokeColor );
454 markerSymbolLayer->setSize( pointSize );
455 QgsMarkerSymbol *markerSymbol = new QgsMarkerSymbol( QgsSymbolLayerList() << markerSymbolLayer );
456
457 QgsVectorTileBasicRendererStyle st1( QStringLiteral( "Polygons" ), QString(), QgsWkbTypes::PolygonGeometry );
458 st1.setFilterExpression( QStringLiteral( "geometry_type($geometry)='Polygon'" ) );
459 st1.setSymbol( fillSymbol );
460
461 QgsVectorTileBasicRendererStyle st2( QStringLiteral( "Lines" ), QString(), QgsWkbTypes::LineGeometry );
462 st2.setFilterExpression( QStringLiteral( "geometry_type($geometry)='Line'" ) );
463 st2.setSymbol( lineSymbol );
464
465 QgsVectorTileBasicRendererStyle st3( QStringLiteral( "Points" ), QString(), QgsWkbTypes::PointGeometry );
466 st3.setFilterExpression( QStringLiteral( "geometry_type($geometry)='Point'" ) );
467 st3.setSymbol( markerSymbol );
468
469 QList<QgsVectorTileBasicRendererStyle> lst;
470 lst << st1 << st2 << st3;
471 return lst;
472}
static QgsColorSchemeRegistry * colorSchemeRegistry()
Returns the application's color scheme registry, used for managing color schemes.
QColor fetchRandomStyleColor() const
Returns a random color for use with a new symbol style (e.g.
RAII class to pop scope from an expression context on destruction.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the scope.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the scope.
Class for parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
QVariant evaluate()
Evaluate the feature and return the result.
bool isValid() const
Checks if this expression is valid.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
QgsFields fields
Definition: qgsfeature.h:66
QgsGeometry geometry
Definition: qgsfeature.h:67
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Definition: qgsfeature.cpp:170
Container of fields for a vector layer.
Definition: qgsfields.h:45
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
Definition: qgsfillsymbol.h:30
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, const QgsFeature *f, QgsRenderContext &context, int layer=-1, bool selected=false)
Renders the symbol using the given render context.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:164
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
virtual void setWidth(double width)
Sets the width of the line symbol layer.
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgslinesymbol.h:30
virtual void setSize(double size)
Sets the symbol size.
A marker symbol type, for rendering Point and MultiPoint geometries.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
Definition: qgsrectangle.h:230
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
Definition: qgsrectangle.h:223
Contains information about the context of a rendering operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setStrokeWidth(double strokeWidth)
void setFillColor(const QColor &color) override
Sets the fill color for the symbol layer.
void setStrokeColor(const QColor &strokeColor) override
Sets the stroke color for the symbol layer.
A simple line symbol layer, which renders lines using a line in a variety of styles (e....
Simple marker symbol layer, consisting of a rendered shape with solid fill color and an stroke.
void setFillColor(const QColor &color) override
Sets the fill color for the symbol layer.
void setStrokeColor(const QColor &color) override
Sets the marker's stroke color.
static QgsSymbolMap loadSymbols(QDomElement &element, const QgsReadWriteContext &context)
Reads a collection of symbols from XML and returns them in a map. Caller is responsible for deleting ...
static QDomElement saveSymbols(QgsSymbolMap &symbols, const QString &tagName, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a collection of symbols to XML with specified tagName for the top-level element.
virtual void setColor(const QColor &color)
Sets the "representative" color for the symbol layer.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:93
void stopRender(QgsRenderContext &context)
Ends the rendering process.
Definition: qgssymbol.cpp:873
void renderFeature(const QgsFeature &feature, QgsRenderContext &context, int layer=-1, bool selected=false, bool drawVertexMarker=false, Qgis::VertexMarkerType currentVertexMarkerType=Qgis::VertexMarkerType::SemiTransparentCircle, double currentVertexMarkerSize=0.0) SIP_THROW(QgsCsException)
Render a feature.
Definition: qgssymbol.cpp:1283
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
Definition: qgssymbol.cpp:825
Range of tiles in a tile matrix to be rendered.
Definition: qgstiles.h:71
int zoomLevel() const
Returns tile's zoom level (Z)
Definition: qgstiles.h:51
Definition of map rendering of a subset of vector tile data.
void setFilterExpression(const QString &expr)
Sets filter expression (empty filter means that all features match)
void setSymbol(QgsSymbol *sym)
Sets symbol for rendering. Takes ownership of the symbol.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const
Writes object content to given DOM element.
QgsVectorTileBasicRendererStyle(const QString &stName=QString(), const QString &laName=QString(), QgsWkbTypes::GeometryType geomType=QgsWkbTypes::UnknownGeometry)
Constructs a style object.
QgsVectorTileBasicRendererStyle & operator=(const QgsVectorTileBasicRendererStyle &other)
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads object content from given DOM element.
The default vector tile renderer implementation.
void renderTile(const QgsVectorTileRendererData &tile, QgsRenderContext &context) override
Renders given vector tile. Must be called between startRender/stopRender.
QList< QgsVectorTileBasicRendererStyle > styles() const
Returns list of styles of the renderer.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads renderer's properties from given XML element.
QMap< QString, QSet< QString > > usedAttributes(const QgsRenderContext &) override
Returns field names of sub-layers that will be used for rendering. Must be called between startRender...
QgsVectorTileBasicRenderer()
Constructs renderer with no styles.
void renderSelectedFeatures(const QList< QgsFeature > &selection, QgsRenderContext &context) override
Renders the specified features in a selected state.
void setStyles(const QList< QgsVectorTileBasicRendererStyle > &styles)
Sets list of styles of the renderer.
void startRender(QgsRenderContext &context, int tileZoom, const QgsTileRange &tileRange) override
Initializes rendering. It should be paired with a stopRender() call.
QString type() const override
Returns unique type name of the renderer implementation.
static QList< QgsVectorTileBasicRendererStyle > simpleStyle(const QColor &polygonFillColor, const QColor &polygonStrokeColor, double polygonStrokeWidth, const QColor &lineStrokeColor, double lineStrokeWidth, const QColor &pointFillColor, const QColor &pointStrokeColor, double pointSize)
Returns a list of styles to render all layers with the given fill/stroke colors, stroke widths and ma...
bool willRenderFeature(const QgsFeature &feature, int tileZoom, const QString &layerName, QgsRenderContext &context) override
Returns true if the specified feature will be rendered in the given render context.
QgsVectorTileBasicRenderer * clone() const override
Returns a clone of the renderer.
static QList< QgsVectorTileBasicRendererStyle > simpleStyleWithRandomColors()
Returns a list of styles to render all layers, using random colors.
QSet< QString > requiredLayers(QgsRenderContext &context, int tileZoom) const override
Returns a list of the layers required for rendering.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes renderer's properties to given XML element.
void stopRender(QgsRenderContext &context) override
Finishes rendering and cleans up any resources.
Contains decoded features of a single vector tile and any other data necessary for rendering of it.
QPolygon tilePolygon() const
Returns polygon (made out of four corners of the tile) in screen coordinates calculated from render c...
QMap< QString, QgsFields > fields() const
Returns per-layer fields.
QgsVectorTileFeatures features() const
Returns features of the tile grouped by sub-layer names.
QgsTileXYZ id() const
Returns coordinates of the tile.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
Definition: qgswkbtypes.h:968
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
Definition: qgswkbtypes.h:141
CORE_EXPORT QgsMeshVertex centroid(const QgsMeshFace &face, const QVector< QgsMeshVertex > &vertices)
Returns the centroid of the face.
const double DEFAULT_LINE_WIDTH
Definition: qgis.h:3017
const double DEFAULT_POINT_SIZE
Magic number that determines the default point size for point symbols.
Definition: qgis.h:3016
QMap< QString, QgsSymbol * > QgsSymbolMap
Definition: qgsrenderer.h:45
QList< QgsSymbolLayer * > QgsSymbolLayerList
Definition: qgssymbol.h:29
QMap< QString, QVector< QgsFeature > > QgsVectorTileFeatures
Features of a vector tile, grouped by sub-layer names (key of the map)