QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsvectorlayerlabelprovider.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectorlayerlabelprovider.cpp
3  --------------------------------------
4  Date : September 2015
5  Copyright : (C) 2015 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 "qgsgeometry.h"
19 #include "qgslabelsearchtree.h"
20 #include "qgspallabeling.h"
21 #include "qgstextlabelfeature.h"
22 #include "qgsvectorlayer.h"
24 #include "qgsrenderer.h"
25 #include "qgspolygon.h"
26 #include "qgslinestring.h"
27 #include "qgsmultipolygon.h"
28 #include "qgslogger.h"
30 
31 #include "feature.h"
32 #include "labelposition.h"
33 
34 #include <QPicture>
35 
36 using namespace pal;
37 
38 QgsVectorLayerLabelProvider::QgsVectorLayerLabelProvider( QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings, const QString &layerName )
39  : QgsAbstractLabelProvider( layer, providerId )
40  , mSettings( settings ? * settings : QgsPalLayerSettings() ) // TODO: all providers should have valid settings?
41  , mLayerGeometryType( layer->geometryType() )
42  , mRenderer( layer->renderer() )
43  , mFields( layer->fields() )
44  , mCrs( layer->crs() )
45 {
46  mName = layerName.isEmpty() ? layer->id() : layerName;
47 
48  if ( withFeatureLoop )
49  {
50  mSource = qgis::make_unique<QgsVectorLayerFeatureSource>( layer );
51  }
52 
53  init();
54 }
55 
57 {
59  mFlags = Flags();
60  if ( mSettings.drawLabels )
61  mFlags |= DrawLabels;
62  if ( mSettings.displayAll )
68  if ( mSettings.labelPerPart )
70 
71  mPriority = 1 - mSettings.priority / 10.0; // convert 0..10 --> 1..0
72 
74  {
75  //override obstacle type to treat any intersection of a label with the point symbol as a high cost conflict
77  }
78  else
79  {
81  }
82 
84 }
85 
86 
88 {
89  qDeleteAll( mLabels );
90 }
91 
92 
93 bool QgsVectorLayerLabelProvider::prepare( const QgsRenderContext &context, QSet<QString> &attributeNames )
94 {
95  const QgsMapSettings &mapSettings = mEngine->mapSettings();
96 
97  return mSettings.prepare( context, attributeNames, mFields, mapSettings, mCrs );
98 }
99 
101 {
102  if ( !mSource )
103  {
104  // we have created the provider with "own feature loop" == false
105  // so it is assumed that prepare() has been already called followed by registerFeature() calls
106  return mLabels;
107  }
108 
109  QSet<QString> attrNames;
110  if ( !prepare( ctx, attrNames ) )
111  return QList<QgsLabelFeature *>();
112 
113  if ( mRenderer )
114  mRenderer->startRender( ctx, mFields );
115 
116  QgsRectangle layerExtent = ctx.extent();
119 
120  QgsFeatureRequest request;
121  request.setFilterRect( layerExtent );
122  request.setSubsetOfAttributes( attrNames, mFields );
123  QgsFeatureIterator fit = mSource->getFeatures( request );
124 
126  ctx.expressionContext().appendScope( symbolScope );
127  QgsFeature fet;
128  while ( fit.nextFeature( fet ) )
129  {
130  QgsGeometry obstacleGeometry;
131  if ( mRenderer )
132  {
133  QgsSymbolList symbols = mRenderer->originalSymbolsForFeature( fet, ctx );
134  if ( !symbols.isEmpty() && fet.geometry().type() == QgsWkbTypes::PointGeometry )
135  {
136  //point feature, use symbol bounds as obstacle
137  obstacleGeometry = QgsVectorLayerLabelProvider::getPointObstacleGeometry( fet, ctx, symbols );
138  }
139  if ( !symbols.isEmpty() )
140  {
141  symbolScope = QgsExpressionContextUtils::updateSymbolScope( symbols.at( 0 ), symbolScope );
142  }
143  }
144  ctx.expressionContext().setFeature( fet );
145  registerFeature( fet, ctx, obstacleGeometry );
146  }
147 
148  if ( ctx.expressionContext().lastScope() == symbolScope )
149  delete ctx.expressionContext().popScope();
150 
151  if ( mRenderer )
152  mRenderer->stopRender( ctx );
153 
154  return mLabels;
155 }
156 
157 void QgsVectorLayerLabelProvider::registerFeature( const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry )
158 {
159  QgsLabelFeature *label = nullptr;
160 
161  mSettings.registerFeature( feature, context, &label, obstacleGeometry );
162  if ( label )
163  mLabels << label;
164 }
165 
167 {
168  if ( !fet.hasGeometry() || fet.geometry().type() != QgsWkbTypes::PointGeometry )
169  return QgsGeometry();
170 
171  bool isMultiPoint = fet.geometry().constGet()->nCoordinates() > 1;
172  std::unique_ptr< QgsAbstractGeometry > obstacleGeom;
173  if ( isMultiPoint )
174  obstacleGeom = qgis::make_unique< QgsMultiPolygon >();
175 
176  // for each point
177  for ( int i = 0; i < fet.geometry().constGet()->nCoordinates(); ++i )
178  {
179  QRectF bounds;
180  QgsPoint p = fet.geometry().constGet()->vertexAt( QgsVertexId( i, 0, 0 ) );
181  double x = p.x();
182  double y = p.y();
183  double z = 0; // dummy variable for coordinate transforms
184 
185  //transform point to pixels
186  if ( context.coordinateTransform().isValid() )
187  {
188  try
189  {
190  context.coordinateTransform().transformInPlace( x, y, z );
191  }
192  catch ( QgsCsException & )
193  {
194  return QgsGeometry();
195  }
196  }
197  context.mapToPixel().transformInPlace( x, y );
198 
199  QPointF pt( x, y );
200  const auto constSymbols = symbols;
201  for ( QgsSymbol *symbol : constSymbols )
202  {
203  if ( symbol->type() == QgsSymbol::Marker )
204  {
205  if ( bounds.isValid() )
206  bounds = bounds.united( static_cast< QgsMarkerSymbol * >( symbol )->bounds( pt, context, fet ) );
207  else
208  bounds = static_cast< QgsMarkerSymbol * >( symbol )->bounds( pt, context, fet );
209  }
210  }
211 
212  //convert bounds to a geometry
213  QVector< double > bX;
214  bX << bounds.left() << bounds.right() << bounds.right() << bounds.left();
215  QVector< double > bY;
216  bY << bounds.top() << bounds.top() << bounds.bottom() << bounds.bottom();
217  std::unique_ptr< QgsLineString > boundLineString = qgis::make_unique< QgsLineString >( bX, bY );
218 
219  //then transform back to map units
220  //TODO - remove when labeling is refactored to use screen units
221  for ( int i = 0; i < boundLineString->numPoints(); ++i )
222  {
223  QgsPointXY point = context.mapToPixel().toMapCoordinates( static_cast<int>( boundLineString->xAt( i ) ),
224  static_cast<int>( boundLineString->yAt( i ) ) );
225  boundLineString->setXAt( i, point.x() );
226  boundLineString->setYAt( i, point.y() );
227  }
228  if ( context.coordinateTransform().isValid() )
229  {
230  try
231  {
232  boundLineString->transform( context.coordinateTransform(), QgsCoordinateTransform::ReverseTransform );
233  }
234  catch ( QgsCsException & )
235  {
236  return QgsGeometry();
237  }
238  }
239  boundLineString->close();
240 
241  if ( context.coordinateTransform().isValid() )
242  {
243  // coordinate transforms may have resulted in nan coordinates - if so, strip these out
244  boundLineString->filterVertices( []( const QgsPoint & point )->bool
245  {
246  return std::isfinite( point.x() ) && std::isfinite( point.y() );
247  } );
248  if ( !boundLineString->isRing() )
249  return QgsGeometry();
250  }
251 
252  std::unique_ptr< QgsPolygon > obstaclePolygon = qgis::make_unique< QgsPolygon >();
253  obstaclePolygon->setExteriorRing( boundLineString.release() );
254 
255  if ( isMultiPoint )
256  {
257  static_cast<QgsMultiPolygon *>( obstacleGeom.get() )->addGeometry( obstaclePolygon.release() );
258  }
259  else
260  {
261  obstacleGeom = std::move( obstaclePolygon );
262  }
263  }
264 
265  return QgsGeometry( std::move( obstacleGeom ) );
266 }
267 
269 {
270  if ( !mSettings.drawLabels )
271  return;
272 
273  QgsTextLabelFeature *lf = dynamic_cast<QgsTextLabelFeature *>( label->getFeaturePart()->feature() );
274 
275  // Copy to temp, editable layer settings
276  // these settings will be changed by any data defined values, then used for rendering label components
277  // settings may be adjusted during rendering of components
278  QgsPalLayerSettings tmpLyr( mSettings );
279 
280  // apply any previously applied data defined settings for the label
281  const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues = lf->dataDefinedValues();
282 
283  //font
284  QFont dFont = lf->definedFont();
285  QgsDebugMsgLevel( QStringLiteral( "PAL font tmpLyr: %1, Style: %2" ).arg( tmpLyr.format().font().toString(), tmpLyr.format().font().styleName() ), 4 );
286  QgsDebugMsgLevel( QStringLiteral( "PAL font definedFont: %1, Style: %2" ).arg( dFont.toString(), dFont.styleName() ), 4 );
287 
288  QgsTextFormat format = tmpLyr.format();
289  format.setFont( dFont );
290 
291  // size has already been calculated and stored in the defined font - this calculated size
292  // is in pixels
293  format.setSize( dFont.pixelSize() );
295  tmpLyr.setFormat( format );
296 
298  {
299  //calculate font alignment based on label quadrant
300  switch ( label->getQuadrant() )
301  {
302  case LabelPosition::QuadrantAboveLeft:
303  case LabelPosition::QuadrantLeft:
304  case LabelPosition::QuadrantBelowLeft:
306  break;
307  case LabelPosition::QuadrantAbove:
308  case LabelPosition::QuadrantOver:
309  case LabelPosition::QuadrantBelow:
311  break;
312  case LabelPosition::QuadrantAboveRight:
313  case LabelPosition::QuadrantRight:
314  case LabelPosition::QuadrantBelowRight:
316  break;
317  }
318  }
319 
320  // update tmpLyr with any data defined text style values
321  QgsPalLabeling::dataDefinedTextStyle( tmpLyr, ddValues );
322 
323  // update tmpLyr with any data defined text buffer values
324  QgsPalLabeling::dataDefinedTextBuffer( tmpLyr, ddValues );
325 
326  // update tmpLyr with any data defined text formatting values
327  QgsPalLabeling::dataDefinedTextFormatting( tmpLyr, ddValues );
328 
329  // update tmpLyr with any data defined shape background values
330  QgsPalLabeling::dataDefinedShapeBackground( tmpLyr, ddValues );
331 
332  // update tmpLyr with any data defined drop shadow values
333  QgsPalLabeling::dataDefinedDropShadow( tmpLyr, ddValues );
334 
335  // Render the components of a label in reverse order
336  // (backgrounds -> text)
337 
339  {
340  QgsTextFormat format = tmpLyr.format();
341 
342  if ( tmpLyr.format().background().enabled() )
343  {
345  }
346  else if ( tmpLyr.format().buffer().enabled() )
347  {
349  }
350  else
351  {
353  }
354 
355  tmpLyr.setFormat( format );
356  }
357 
358  if ( tmpLyr.format().background().enabled() )
359  {
360  drawLabelPrivate( label, context, tmpLyr, QgsTextRenderer::Background );
361  }
362 
363  if ( tmpLyr.format().buffer().enabled() )
364  {
365  drawLabelPrivate( label, context, tmpLyr, QgsTextRenderer::Buffer );
366  }
367 
368  drawLabelPrivate( label, context, tmpLyr, QgsTextRenderer::Text );
369 
370  // add to the results
371  QString labeltext = label->getFeaturePart()->feature()->labelText();
372  mEngine->results()->mLabelSearchTree->insertLabel( label, label->getFeaturePart()->featureId(), mLayerId, labeltext, dFont, false, lf->hasFixedPosition(), mProviderId );
373 }
374 
375 
377 {
378  // NOTE: this is repeatedly called for multi-part labels
379  QPainter *painter = context.painter();
380 
381  // features are pre-rotated but not scaled/translated,
382  // so we only disable rotation here. Ideally, they'd be
383  // also pre-scaled/translated, as suggested here:
384  // https://github.com/qgis/QGIS/issues/20071
385  QgsMapToPixel xform = context.mapToPixel();
386  xform.setMapRotation( 0, 0, 0 );
387 
388  QPointF outPt = xform.transform( label->getX(), label->getY() ).toQPointF();
389 
390  if ( mEngine->engineSettings().testFlag( QgsLabelingEngineSettings::DrawLabelRectOnly ) ) // TODO: this should get directly to labeling engine
391  {
392  //debugging rect
393  if ( drawType != QgsTextRenderer::Text )
394  return;
395 
396  QgsPointXY outPt2 = xform.transform( label->getX() + label->getWidth(), label->getY() + label->getHeight() );
397  QRectF rect( 0, 0, outPt2.x() - outPt.x(), outPt2.y() - outPt.y() );
398  painter->save();
399  painter->setRenderHint( QPainter::Antialiasing, false );
400  painter->translate( QPointF( outPt.x(), outPt.y() ) );
401  painter->rotate( -label->getAlpha() * 180 / M_PI );
402 
403  if ( label->conflictsWithObstacle() )
404  {
405  painter->setBrush( QColor( 255, 0, 0, 100 ) );
406  painter->setPen( QColor( 255, 0, 0, 150 ) );
407  }
408  else
409  {
410  painter->setBrush( QColor( 0, 255, 0, 100 ) );
411  painter->setPen( QColor( 0, 255, 0, 150 ) );
412  }
413 
414  painter->drawRect( rect );
415  painter->restore();
416 
417  if ( label->getNextPart() )
418  drawLabelPrivate( label->getNextPart(), context, tmpLyr, drawType, dpiRatio );
419 
420  return;
421  }
422 
423  QgsTextRenderer::Component component;
424  component.dpiRatio = dpiRatio;
425  component.origin = outPt;
426  component.rotation = label->getAlpha();
427 
428 
429 
430  if ( drawType == QgsTextRenderer::Background )
431  {
432  // get rotated label's center point
433  QPointF centerPt( outPt );
434  QgsPointXY outPt2 = xform.transform( label->getX() + label->getWidth() / 2,
435  label->getY() + label->getHeight() / 2 );
436 
437  double xc = outPt2.x() - outPt.x();
438  double yc = outPt2.y() - outPt.y();
439 
440  double angle = -component.rotation;
441  double xd = xc * std::cos( angle ) - yc * std::sin( angle );
442  double yd = xc * std::sin( angle ) + yc * std::cos( angle );
443 
444  centerPt.setX( centerPt.x() + xd );
445  centerPt.setY( centerPt.y() + yd );
446 
447  component.center = centerPt;
448 
449  // convert label size to render units
450  double labelWidthPx = context.convertToPainterUnits( label->getWidth(), QgsUnitTypes::RenderMapUnits, QgsMapUnitScale() );
451  double labelHeightPx = context.convertToPainterUnits( label->getHeight(), QgsUnitTypes::RenderMapUnits, QgsMapUnitScale() );
452 
453  component.size = QSizeF( labelWidthPx, labelHeightPx );
454 
455  QgsTextRenderer::drawBackground( context, component, tmpLyr.format(), QStringList(), QgsTextRenderer::Label );
456  }
457 
458  else if ( drawType == QgsTextRenderer::Buffer
459  || drawType == QgsTextRenderer::Text )
460  {
461 
462  // TODO: optimize access :)
463  QgsTextLabelFeature *lf = static_cast<QgsTextLabelFeature *>( label->getFeaturePart()->feature() );
464  QString txt = lf->text( label->getPartId() );
465  QFontMetricsF *labelfm = lf->labelFontMetrics();
466 
467  //add the direction symbol if needed
468  if ( !txt.isEmpty() && tmpLyr.placement == QgsPalLayerSettings::Line &&
469  tmpLyr.addDirectionSymbol )
470  {
471  bool prependSymb = false;
472  QString symb = tmpLyr.rightDirectionSymbol;
473 
474  if ( label->getReversed() )
475  {
476  prependSymb = true;
477  symb = tmpLyr.leftDirectionSymbol;
478  }
479 
480  if ( tmpLyr.reverseDirectionSymbol )
481  {
482  if ( symb == tmpLyr.rightDirectionSymbol )
483  {
484  prependSymb = true;
485  symb = tmpLyr.leftDirectionSymbol;
486  }
487  else
488  {
489  prependSymb = false;
490  symb = tmpLyr.rightDirectionSymbol;
491  }
492  }
493 
495  {
496  prependSymb = true;
497  symb = symb + QStringLiteral( "\n" );
498  }
500  {
501  prependSymb = false;
502  symb = QStringLiteral( "\n" ) + symb;
503  }
504 
505  if ( prependSymb )
506  {
507  txt.prepend( symb );
508  }
509  else
510  {
511  txt.append( symb );
512  }
513  }
514 
515  //QgsDebugMsgLevel( "drawLabel " + txt, 4 );
516  QStringList multiLineList = QgsPalLabeling::splitToLines( txt, tmpLyr.wrapChar, tmpLyr.autoWrapLength, tmpLyr.useMaxLineLengthForAutoWrap );
517 
521  else if ( tmpLyr.multilineAlign == QgsPalLayerSettings::MultiRight )
523 
524  QgsTextRenderer::Component component;
525  component.origin = outPt;
526  component.rotation = label->getAlpha();
527 
528  QgsTextRenderer::drawTextInternal( drawType, context, tmpLyr.format(), component, multiLineList, labelfm,
529  hAlign, QgsTextRenderer::Label );
530 
531  }
532 
533  // NOTE: this used to be within above multi-line loop block, at end. (a mistake since 2010? [LS])
534  if ( label->getNextPart() )
535  drawLabelPrivate( label->getNextPart(), context, tmpLyr, drawType, dpiRatio );
536 }
void registerFeature(const QgsFeature &f, QgsRenderContext &context, QgsLabelFeature **labelFeature=nullptr, QgsGeometry obstacleGeometry=QgsGeometry())
Register a feature for labeling.
QList< QgsLabelFeature * > mLabels
List of generated.
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
Wrapper for iterator of features from vector data provider or vector layer.
QgsVectorLayerLabelProvider(QgsVectorLayer *layer, const QString &providerId, bool withFeatureLoop, const QgsPalLayerSettings *settings, const QString &layerName=QString())
Convenience constructor to initialize the provider from given vector layer.
QString labelText() const
Text of the label.
A rectangle specified with double values.
Definition: qgsrectangle.h:41
double y
Definition: qgspoint.h:42
QString leftDirectionSymbol
String to use for left direction arrows.
QgsWkbTypes::GeometryType mLayerGeometryType
Geometry type of layer.
void setMapRotation(double degrees, double cx, double cy)
Set map rotation in degrees (clockwise)
QgsTextShadowSettings::ShadowPlacement shadowPlacement() const
Returns the placement for the drop shadow.
QgsPalLayerSettings::Placement mPlacement
Placement strategy.
QgsFeatureId featureId() const
Returns the unique ID of the feature.
Definition: feature.cpp:151
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:61
std::unique_ptr< QgsAbstractFeatureSource > mSource
Layer&#39;s feature source.
QgsLabelFeature * feature()
Returns the parent feature.
Definition: feature.h:118
const QgsLabelingEngine * mEngine
Associated labeling engine.
Draw shadow under buffer.
UpsideDownLabels upsidedownLabels
Controls whether upside down labels are displayed and how they are handled.
virtual void registerFeature(const QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry=QgsGeometry())
Register a feature for labeling as one or more QgsLabelFeature objects stored into mLabels...
Place direction symbols on below label.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
double mPriority
Default priority of labels.
QgsTextShadowSettings & shadow()
Returns a reference to the text drop shadow settings.
double getY(int i=0) const
Returns the down-left y coordinate.
double y
Definition: qgspointxy.h:48
A class to represent a 2D point.
Definition: qgspointxy.h:43
HAlignment
Horizontal alignment.
void setFont(const QFont &font)
Sets the font used for rendering text.
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant > & dataDefinedValues() const
Gets data-defined values.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
Class that adds extra information to QgsLabelFeature for text labels.
bool addDirectionSymbol
If true, &#39;<&#39; or &#39;>&#39; (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) will be ...
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:111
Whether to only draw the label rect and not the actual label text (used for unit tests) ...
bool drawLabels
Whether to draw labels for this layer.
bool mergeLines
true if connected line features with identical label text should be merged prior to generating label ...
MultiLineAlign multilineAlign
Horizontal alignment of multi-line labels.
Whether to label each part of multi-part features separately.
FeaturePart * getFeaturePart()
Returns the feature corresponding to this labelposition.
Label-specific draw mode.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
const QgsCoordinateReferenceSystem & crs
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:197
int autoWrapLength
If non-zero, indicates that label text should be automatically wrapped to (ideally) the specified num...
QgsCoordinateTransform ct
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
Definition: MathUtils.cpp:786
bool reverseDirectionSymbol
True if direction symbols should be reversed.
A marker symbol type, for rendering Point and MultiPoint geometries.
Definition: qgssymbol.h:766
bool isValid() const
Returns true if the coordinate transform is valid, ie both the source and destination CRS have been s...
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
virtual QgsSymbolList originalSymbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Equivalent of originalSymbolsForFeature() call extended to support renderers that may use more symbol...
Whether adjacent lines (with the same label text) should be merged.
The QgsMapSettings class contains configuration for rendering of the map.
QList< QgsLabelFeature * > labelFeatures(QgsRenderContext &context) override
Returns list of label features (they are owned by the provider and thus deleted on its destruction) ...
QgsMapLayer * layer() const
Returns the associated layer, or nullptr if no layer is associated with the provider.
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
void init()
initialization method - called from constructors
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:37
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
ObstacleType obstacleType
Controls how features act as obstacles for labels.
QList< QgsSymbol * > QgsSymbolList
Definition: qgsrenderer.h:43
bool displayAll
If true, all features will be labelled even when overlaps occur.
void setSize(double size)
Sets the size for rendered text.
QString id() const
Returns the layer&#39;s unique ID, which is used to access this layer from QgsProject.
const QgsLabelingEngineSettings & engineSettings() const
Gets associated labeling engine settings.
virtual bool prepare(const QgsRenderContext &context, QSet< QString > &attributeNames)
Prepare for registration of features.
Utility class for identifying a unique vertex within a geometry.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
bool isShortCircuited() const
Returns true if the transform short circuits because the source and destination are equivalent...
Buffer component.
double getHeight() const
QgsPalLayerSettings mSettings
Layer&#39;s labeling configuration.
LabelPosition * getNextPart() const
This class wraps a request for features to a vector layer (or directly its vector data provider)...
Flags mFlags
Flags altering drawing and registration of features.
Draw shadow under text.
Whether location of centroid must be inside of polygons.
Quadrant getQuadrant() const
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the size of rendered text.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
QString text(int partId) const
Returns the text component corresponding to a specified label part.
Whether all features will be labelled even though overlaps occur.
Single scope for storing variables and functions for use within a QgsExpressionContext.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
The QgsAbstractLabelProvider class is an interface class.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc...
double x
Definition: qgspointxy.h:47
Place direction symbols on above label.
Draw shadow below all text components.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsExpressionContext & expressionContext()
Gets the expression context.
void transformInPlace(double &x, double &y, double &z, TransformDirection direction=ForwardTransform) const SIP_THROW(QgsCsException)
Transforms an array of x, y and z double coordinates in place, from the source CRS to the destination...
QString wrapChar
Wrapping character string.
TextPart
Components of text.
QgsFields mFields
Layer&#39;s fields.
QString rightDirectionSymbol
String to use for right direction arrows.
Marker symbol.
Definition: qgssymbol.h:85
Arranges candidates parallel to a generalised line representing the feature or parallel to a polygon&#39;...
Contains information about the context of a rendering operation.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
QFont definedFont()
Font to be used for rendering.
bool hasFixedPosition() const
Whether the label should use a fixed position instead of being automatically placed.
QPainter * painter()
Returns the destination QPainter for the render operation.
The QgsLabelFeature class describes a feature that should be used within the labeling engine...
const QgsMapToPixel & mapToPixel() const
Returns the context&#39;s map to pixel transform, which transforms between map coordinates and device coo...
Transform from destination to source CRS.
double getAlpha() const
Returns the angle to rotate text (in rad).
Multi polygon geometry collection.
QString mName
Name of the layer.
bool enabled() const
Returns whether the shadow is enabled.
Struct for storing maximum and minimum scales for measurements in map units.
QgsCoordinateReferenceSystem mCrs
Layer&#39;s CRS.
double getWidth() const
bool conflictsWithObstacle() const
Returns whether the position is marked as conflicting with an obstacle feature.
double getX(int i=0) const
Returns the down-left x coordinate.
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
Definition: qgsrenderer.cpp:93
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
const QgsMapSettings & mapSettings() const
Gets associated map settings.
bool enabled() const
Returns whether the background is enabled.
bool testFlag(Flag f) const
Test whether a particular flag is enabled.
QgsLabelingResults * results() const
For internal use by the providers.
virtual void stopRender(QgsRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
QString mProviderId
Associated provider ID (one layer may have multiple providers, e.g. in rule-based labeling) ...
LabelPosition is a candidate feature label position.
Definition: labelposition.h:55
QgsPalLayerSettings::ObstacleType mObstacleType
Type of the obstacle of feature geometries.
bool enabled() const
Returns whether the buffer is enabled.
QgsPalLayerSettings::UpsideDownLabels mUpsidedownLabels
How to handle labels that would be upside down.
void setShadowPlacement(QgsTextShadowSettings::ShadowPlacement placement)
Sets the placement for the drop shadow.
Draw shadow under background shape.
Whether the labels should be rendered.
bool prepare(const QgsRenderContext &context, QSet< QString > &attributeNames, const QgsFields &fields, const QgsMapSettings &mapSettings, const QgsCoordinateReferenceSystem &crs)
Prepare for registration of features.
QgsWkbTypes::GeometryType type
Definition: qgsgeometry.h:115
QgsGeometry geometry
Definition: qgsfeature.h:67
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
QgsExpressionContextScope * popScope()
Removes the last scope from the expression context and return it.
bool getReversed() const
bool nextFeature(QgsFeature &f)
Container for all settings relating to text rendering.
QFontMetricsF * labelFontMetrics()
Metrics of the font for rendering.
bool centroidInside
true if centroid positioned labels must be placed inside their corresponding feature polygon...
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
Represents a vector layer which manages a vector based data sets.
QString mLayerId
Associated layer&#39;s ID, if applicable.
QFont font() const
Returns the font used for rendering text.
int priority
Label priority.
QgsPointXY toMapCoordinates(int x, int y) const
Transform device coordinates to map (world) coordinates.
bool labelPerPart
true if every part of a multi-part feature should be labeled.
void drawLabel(QgsRenderContext &context, pal::LabelPosition *label) const override
draw this label at the position determined by the labeling engine
void drawLabelPrivate(pal::LabelPosition *label, QgsRenderContext &context, QgsPalLayerSettings &tmpLyr, QgsTextRenderer::TextPart drawType, double dpiRatio=1.0) const
Internal label drawing method.
bool useMaxLineLengthForAutoWrap
If true, indicates that when auto wrapping label text the autoWrapLength length indicates the maximum...
int getPartId() const
static QStringList splitToLines(const QString &text, const QString &wrapCharacter, int autoWrapLength=0, bool useMaxLineLengthWhenAutoWrapping=true)
Splits a text string to a list of separate lines, using a specified wrap character (wrapCharacter)...
QgsRectangle transformBoundingBox(const QgsRectangle &rectangle, TransformDirection direction=ForwardTransform, bool handle180Crossover=false) const SIP_THROW(QgsCsException)
Transforms a rectangle from the source CRS to the destination CRS.
static QgsGeometry getPointObstacleGeometry(QgsFeature &fet, QgsRenderContext &context, const QgsSymbolList &symbols)
Returns the geometry for a point feature which should be used as an obstacle for labels.
DirectionSymbols placeDirectionSymbol
Placement option for direction symbols.
double x
Definition: qgspoint.h:41