35static bool _palIsCanceled( 
void *ctx )
 
   37  return ( 
reinterpret_cast< QgsRenderContext * 
>( ctx ) )->renderingStopped();
 
   51    explicit QgsLabelSorter( 
const QStringList &layerRenderingOrderIds )
 
   52      : mLayerRenderingOrderIds( layerRenderingOrderIds )
 
   64      int layer1Pos = mLayerRenderingOrderIds.indexOf( lf1->
provider()->
layerId() );
 
   65      int layer2Pos = mLayerRenderingOrderIds.indexOf( lf2->
provider()->
layerId() );
 
   66      if ( layer1Pos != layer2Pos && layer1Pos >= 0 && layer2Pos >= 0 )
 
   67        return layer1Pos > layer2Pos; 
 
   70      return lf1->
size().width() * lf1->
size().height() > lf2->
size().width() * lf2->
size().height();
 
   75    const QStringList mLayerRenderingOrderIds;
 
  104  QList< QgsMapLayer * > layers;
 
  107  QList< QgsAbstractLabelProvider * > providersByZ = 
mProviders;
 
  108  std::sort( providersByZ.begin(), providersByZ.end(),
 
  111    const QgsVectorLayerLabelProvider *providerA = dynamic_cast<const QgsVectorLayerLabelProvider *>( a );
 
  112    const QgsVectorLayerLabelProvider *providerB = dynamic_cast<const QgsVectorLayerLabelProvider *>( b );
 
  114    if ( providerA && providerB )
 
  116      return providerA->settings().zIndex < providerB->settings().zIndex ;
 
  121  QList< QgsAbstractLabelProvider * > subProvidersByZ = mSubProviders;
 
  122  std::sort( subProvidersByZ.begin(), subProvidersByZ.end(),
 
  125    const QgsVectorLayerLabelProvider *providerA = dynamic_cast<const QgsVectorLayerLabelProvider *>( a );
 
  126    const QgsVectorLayerLabelProvider *providerB = dynamic_cast<const QgsVectorLayerLabelProvider *>( b );
 
  128    if ( providerA && providerB )
 
  130      return providerA->settings().zIndex < providerB->settings().zIndex ;
 
  137    if ( provider->layer() && !layers.contains( provider->layer() ) )
 
  138      layers << provider->layer();
 
  142    if ( provider->layer() && !layers.contains( provider->layer() ) )
 
  143      layers << provider->layer();
 
  153  QList< QgsAbstractLabelProvider * > providersByZ = 
mProviders;
 
  154  std::sort( providersByZ.begin(), providersByZ.end(),
 
  157    const QgsVectorLayerLabelProvider *providerA = dynamic_cast<const QgsVectorLayerLabelProvider *>( a );
 
  158    const QgsVectorLayerLabelProvider *providerB = dynamic_cast<const QgsVectorLayerLabelProvider *>( b );
 
  160    if ( providerA && providerB )
 
  162      return providerA->settings().zIndex < providerB->settings().zIndex ;
 
  167  QList< QgsAbstractLabelProvider * > subProvidersByZ = mSubProviders;
 
  168  std::sort( subProvidersByZ.begin(), subProvidersByZ.end(),
 
  171    const QgsVectorLayerLabelProvider *providerA = dynamic_cast<const QgsVectorLayerLabelProvider *>( a );
 
  172    const QgsVectorLayerLabelProvider *providerB = dynamic_cast<const QgsVectorLayerLabelProvider *>( b );
 
  174    if ( providerA && providerB )
 
  176      return providerA->settings().zIndex < providerB->settings().zIndex ;
 
  183    if ( !layers.contains( provider->layerId() ) )
 
  184      layers << provider->layerId();
 
  188    if ( !layers.contains( provider->layerId() ) )
 
  189      layers << provider->layerId();
 
  211  QgsAbstractLabelProvider::Flags flags = provider->
flags();
 
  233  const QList<QgsLabelFeature *> features = provider->
labelFeatures( context );
 
  241    catch ( std::exception &e )
 
  244      QgsDebugMsgLevel( QStringLiteral( 
"Ignoring feature %1 due PAL exception:" ).arg( feature->id() ) + QString::fromLatin1( e.what() ), 4 );
 
  263    feedback->emit labelRegistrationAboutToBegin();
 
  267  mPal = std::make_unique< pal::Pal >();
 
  282      feedback->emit providerRegistrationAboutToBegin( provider );
 
  286    std::unique_ptr< QgsExpressionContextScopePopper > layerScopePopper;
 
  287    if ( provider->layerExpressionContextScope() )
 
  293      feedback->emit providerRegistrationFinished( provider );
 
  296    feedback->emit labelRegistrationFinished();
 
  301  Q_ASSERT( 
mPal.get() );
 
  306  QPainter *painter = context.
painter();
 
  313  visiblePoly.append( visiblePoly.at( 0 ) ); 
 
  322    mapBoundaryGeom = mapBoundaryGeom.
difference( region.geometry );
 
  330    QVariantMap properties;
 
  331    properties.insert( QStringLiteral( 
"style" ), QStringLiteral( 
"no" ) );
 
  332    properties.insert( QStringLiteral( 
"style_border" ), QStringLiteral( 
"solid" ) );
 
  333    properties.insert( QStringLiteral( 
"color_border" ), QStringLiteral( 
"#0000ff" ) );
 
  334    properties.insert( QStringLiteral( 
"width_border" ), QStringLiteral( 
"0.3" ) );
 
  335    properties.insert( QStringLiteral( 
"joinstyle" ), QStringLiteral( 
"miter" ) );
 
  337    boundarySymbol->startRender( context );
 
  338    boundarySymbol->renderFeature( f, context );
 
  339    boundarySymbol->stopRender( context );
 
  352  mPal->registerCancellationCallback( &_palIsCanceled, 
reinterpret_cast< void * 
>( &context ) );
 
  360    mProblem = 
mPal->extractProblem( extent, mapBoundaryGeom, context );
 
  362  catch ( std::exception &e )
 
  365    QgsDebugMsgLevel( 
"PAL EXCEPTION :-( " + QString::fromLatin1( e.what() ), 4 );
 
  391    painter->setBrush( Qt::NoBrush );
 
  392    for ( 
int i = 0; i < static_cast< int >( 
mProblem->featureCount() ); i++ )
 
  394      for ( 
int j = 0; j < 
mProblem->featureCandidateCount( i ); j++ )
 
  410  std::sort( 
mLabels.begin(), 
mLabels.end(), QgsLabelSorter( mLayerRenderingOrderIds ) );
 
  412  QgsDebugMsgLevel( QStringLiteral( 
"LABELING work:  %1 ms ... labels# %2" ).arg( t.elapsed() ).arg( 
mLabels.size() ), 4 );
 
  423  QPainter *painter = context.
painter();
 
  428    if ( !layerId.isEmpty() && provider->layerId() != layerId )
 
  436    provider->startRender( context );
 
  440  std::unique_ptr< QgsExpressionContextScopePopper > symbolScopePopper = std::make_unique< QgsExpressionContextScopePopper >( context.
expressionContext(), symbolScope );
 
  527  symbolScopePopper.reset();
 
  532    if ( !layerId.isEmpty() && provider->layerId() != layerId )
 
  535    provider->stopRender( context );
 
  539  painter->setCompositionMode( QPainter::CompositionMode_SourceOver );
 
  541  QgsDebugMsgLevel( QStringLiteral( 
"LABELING draw:  %1 ms" ).arg( t.elapsed() ), 4 );
 
  637  : mLayerId( layer ? layer->id() : QString() )
 
  639  , mProviderId( providerId )
 
  643    mLayerExpressionContextScope.reset( vl->createExpressionContextScope() );
 
  645      mLayerReferenceScale = renderer->referenceScale();
 
  664    subProvider->startRender( context );
 
  673    subProvider->stopRender( context );
 
  679  return mLayerExpressionContextScope.get();
 
  688  QStringList predefinedOrderString;
 
  689  const auto constPositions = positions;
 
  695        predefinedOrderString << QStringLiteral( 
"TL" );
 
  698        predefinedOrderString << QStringLiteral( 
"TSL" );
 
  701        predefinedOrderString << QStringLiteral( 
"T" );
 
  704        predefinedOrderString << QStringLiteral( 
"TSR" );
 
  707        predefinedOrderString << QStringLiteral( 
"TR" );
 
  710        predefinedOrderString << QStringLiteral( 
"L" );
 
  713        predefinedOrderString << QStringLiteral( 
"R" );
 
  716        predefinedOrderString << QStringLiteral( 
"BL" );
 
  719        predefinedOrderString << QStringLiteral( 
"BSL" );
 
  722        predefinedOrderString << QStringLiteral( 
"B" );
 
  725        predefinedOrderString << QStringLiteral( 
"BSR" );
 
  728        predefinedOrderString << QStringLiteral( 
"BR" );
 
  732  return predefinedOrderString.join( 
',' );
 
  737  QVector<Qgis::LabelPredefinedPointPosition> result;
 
  738  const QStringList predefinedOrderList = positionString.split( 
',' );
 
  739  result.reserve( predefinedOrderList.size() );
 
  740  for ( 
const QString &position : predefinedOrderList )
 
  742    QString cleaned = position.trimmed().toUpper();
 
  743    if ( cleaned == QLatin1String( 
"TL" ) )
 
  745    else if ( cleaned == QLatin1String( 
"TSL" ) )
 
  747    else if ( cleaned == QLatin1String( 
"T" ) )
 
  749    else if ( cleaned == QLatin1String( 
"TSR" ) )
 
  751    else if ( cleaned == QLatin1String( 
"TR" ) )
 
  753    else if ( cleaned == QLatin1String( 
"L" ) )
 
  755    else if ( cleaned == QLatin1String( 
"R" ) )
 
  757    else if ( cleaned == QLatin1String( 
"BL" ) )
 
  759    else if ( cleaned == QLatin1String( 
"BSL" ) )
 
  761    else if ( cleaned == QLatin1String( 
"B" ) )
 
  763    else if ( cleaned == QLatin1String( 
"BSR" ) )
 
  765    else if ( cleaned == QLatin1String( 
"BR" ) )
 
  775    parts << QStringLiteral( 
"OL" );
 
  777    parts << QStringLiteral( 
"AL" );
 
  779    parts << QStringLiteral( 
"BL" );
 
  781    parts << QStringLiteral( 
"LO" );
 
  782  return parts.join( 
',' );
 
  787  Qgis::LabelLinePlacementFlags flags = Qgis::LabelLinePlacementFlags();
 
  788  const QStringList flagList = 
string.split( 
',' );
 
  789  bool foundLineOrientationFlag = 
false;
 
  790  for ( 
const QString &flag : flagList )
 
  792    QString cleaned = flag.trimmed().toUpper();
 
  793    if ( cleaned == QLatin1String( 
"OL" ) )
 
  795    else if ( cleaned == QLatin1String( 
"AL" ) )
 
  797    else if ( cleaned == QLatin1String( 
"BL" ) )
 
  799    else if ( cleaned == QLatin1String( 
"LO" ) )
 
  800      foundLineOrientationFlag = 
true;
 
  802  if ( !foundLineOrientationFlag )
 
@ BelowLine
Labels can be placed below a line feature. Unless MapOrientation is also specified this mode respects...
 
@ MapOrientation
Signifies that the AboveLine and BelowLine flags should respect the map's orientation rather than the...
 
@ OnLine
Labels can be placed directly over a line feature.
 
@ AboveLine
Labels can be placed above a line feature. Unless MapOrientation is also specified this mode respects...
 
@ DrawCandidates
Whether to draw rectangles of generated candidates (good for debugging)
 
@ CollectUnplacedLabels
Whether unplaced labels should be collected in the labeling results (regardless of whether they are b...
 
@ DrawUnplacedLabels
Whether to render unplaced labels as an indicator/warning for users.
 
@ UseAllLabels
Whether to draw all labels even if there would be collisions.
 
@ UsePartialCandidates
Whether to use also label candidates that are partially outside of the map view.
 
LabelPredefinedPointPosition
Positions for labels when using the Qgis::LabelPlacement::OrderedPositionsAroundPoint placement mode.
 
@ MiddleLeft
Label on left of point.
 
@ TopRight
Label on top-right of point.
 
@ MiddleRight
Label on right of point.
 
@ TopSlightlyRight
Label on top of point, slightly right of center.
 
@ TopMiddle
Label directly above point.
 
@ BottomSlightlyLeft
Label below point, slightly left of center.
 
@ BottomRight
Label on bottom right of point.
 
@ BottomLeft
Label on bottom-left of point.
 
@ BottomSlightlyRight
Label below point, slightly right of center.
 
@ TopLeft
Label on top-left of point.
 
@ BottomMiddle
Label directly below point.
 
@ TopSlightlyLeft
Label on top of point, slightly left of center.
 
The QgsAbstractLabelProvider class is an interface class.
 
QgsExpressionContextScope * layerExpressionContextScope() const
Returns the expression context scope created from the layer associated with this provider.
 
virtual QList< QgsLabelFeature * > labelFeatures(QgsRenderContext &context)=0
Returns list of label features (they are owned by the provider and thus deleted on its destruction)
 
virtual void drawUnplacedLabel(QgsRenderContext &context, pal::LabelPosition *label) const
Draw an unplaced label.
 
virtual void stopRender(QgsRenderContext &context)
To be called after rendering is complete.
 
virtual QList< QgsAbstractLabelProvider * > subProviders()
Returns list of child providers - useful if the provider needs to put labels into more layers with di...
 
Qgis::LabelPlacement placement() const
What placement strategy to use for the labels.
 
void setEngine(const QgsLabelingEngine *engine)
Associate provider with a labeling engine (should be only called internally from QgsLabelingEngine)
 
virtual void drawLabel(QgsRenderContext &context, pal::LabelPosition *label) const =0
Draw this label at the position determined by the labeling engine.
 
double priority() const
Default priority of labels (may be overridden by individual labels)
 
virtual void drawLabelBackground(QgsRenderContext &context, pal::LabelPosition *label) const
Draw the background for the specified label.
 
QString name() const
Name of the layer (for statistics, debugging etc.) - does not need to be unique.
 
double layerReferenceScale() const
Returns the symbology reference scale of the layer associated with this provider.
 
QgsMapLayer * layer() const
Returns the associated layer, or nullptr if no layer is associated with the provider.
 
virtual void startRender(QgsRenderContext &context)
To be called before rendering of labels begins.
 
Flags flags() const
Flags associated with the provider.
 
QgsLabelObstacleSettings::ObstacleType obstacleType() const
How the feature geometries will work as obstacles.
 
@ MergeConnectedLines
Whether adjacent lines (with the same label text) should be merged.
 
@ DrawLabels
Whether the labels should be rendered.
 
@ CentroidMustBeInside
Whether location of centroid must be inside of polygons.
 
QString layerId() const
Returns ID of associated layer, or empty string if no layer is associated with the provider.
 
Qgis::UpsideDownLabelHandling upsidedownLabels() const
How to handle labels that would be upside down.
 
QgsAbstractLabelProvider(QgsMapLayer *layer, const QString &providerId=QString())
Construct the provider with default values.
 
QgsDefaultLabelingEngine()
Construct the labeling engine with default settings.
 
void run(QgsRenderContext &context) override
Runs the labeling job.
 
RAII class to pop scope from an expression context on destruction.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
 
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
 
void setProgress(double progress)
Sets the current progress for the feedback object.
 
static QgsFillSymbol * createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
 
A geometry is the spatial representation of a feature.
 
QgsGeometry difference(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Returns a geometry representing the points making up this geometry that do not make up other.
 
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
 
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
 
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
 
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
 
Label blocking region (in map coordinates and CRS).
 
The QgsLabelFeature class describes a feature that should be used within the labeling engine.
 
QSizeF size(double angle=0.0) const
Size of the label (in map units)
 
QgsAbstractLabelProvider * provider() const
Returns provider of this instance.
 
void setSymbol(const QgsSymbol *symbol)
Sets the feature symbol associated with this label.
 
pal::Layer * mLayer
Pointer to PAL layer (assigned when registered to PAL)
 
QgsFeature feature() const
Returns the original feature associated with this label.
 
double zIndex() const
Returns the label's z-index.
 
const QgsSymbol * symbol() const
Returns the feature symbol associated with this label.
 
QgsFeedback subclass for granular reporting of labeling engine progress.
 
Stores global configuration for labeling engine.
 
Qgis::LabelPlacementEngineVersion placementVersion() const
Returns the placement engine version, which dictates how the label placement problem is solved.
 
bool testFlag(Qgis::LabelingFlag f) const
Test whether a particular flag is enabled.
 
Qgis::LabelingFlags flags() const
Gets flags of the labeling engine.
 
double maximumPolygonCandidatesPerCmSquared() const
Returns the maximum number of polygon label candidate positions per centimeter squared.
 
double maximumLineCandidatesPerCm() const
Returns the maximum number of line label candidate positions per centimeter.
 
The QgsLabelingEngine class provides map labeling functionality.
 
std::unique_ptr< pal::Pal > mPal
 
std::unique_ptr< QgsLabelingResults > mResults
Resulting labeling layout.
 
QgsMapSettings mMapSettings
Associated map settings instance.
 
void solve(QgsRenderContext &context)
Solves the label problem.
 
QList< pal::LabelPosition * > mUnlabeled
 
std::unique_ptr< pal::Problem > mProblem
 
const QgsMapSettings & mapSettings() const
Gets associated map settings.
 
QList< pal::LabelPosition * > mLabels
 
QgsLabelingResults * takeResults()
Returns pointer to recently computed results and pass the ownership of results to the caller.
 
void cleanup()
Cleans up the engine following a call to registerLabels() or solve().
 
void setMapSettings(const QgsMapSettings &mapSettings)
Associate map settings instance.
 
void registerLabels(QgsRenderContext &context)
Runs the label registration step.
 
QList< QgsAbstractLabelProvider * > mSubProviders
 
void addProvider(QgsAbstractLabelProvider *provider)
Add provider of label features. Takes ownership of the provider.
 
void drawLabels(QgsRenderContext &context, const QString &layerId=QString())
Draws labels to the specified render context.
 
QStringList participatingLayerIds() const
Returns a list of layer IDs for layers with providers in the engine.
 
QList< QgsMapLayer * > participatingLayers() const
Returns a list of layers with providers in the engine.
 
void processProvider(QgsAbstractLabelProvider *provider, QgsRenderContext &context, pal::Pal &p)
 
QgsLabelingEngine()
Construct the labeling engine with default settings.
 
void removeProvider(QgsAbstractLabelProvider *provider)
Remove provider if the provider's initialization failed. Provider instance is deleted.
 
QList< QgsAbstractLabelProvider * > mProviders
List of providers (the are owned by the labeling engine)
 
virtual ~QgsLabelingEngine()
Clean up everything (especially the registered providers)
 
Class that stores computed placement from labeling engine.
 
static QString encodePredefinedPositionOrder(const QVector< Qgis::LabelPredefinedPointPosition > &positions)
Encodes an ordered list of predefined point label positions to a string.
 
static QVector< Qgis::LabelPredefinedPointPosition > decodePredefinedPositionOrder(const QString &positionString)
Decodes a string to an ordered list of predefined point label positions.
 
static Qgis::LabelLinePlacementFlags decodeLinePlacementFlags(const QString &string)
Decodes a string to set of line placement flags.
 
static QString encodeLinePlacementFlags(Qgis::LabelLinePlacementFlags flags)
Encodes line placement flags to a string.
 
Base class for all map layer types.
 
The QgsMapSettings class contains configuration for rendering of the map.
 
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns the global configuration of the labeling engine.
 
QgsGeometry labelBoundaryGeometry() const
Returns the label boundary geometry, which restricts where in the rendered map labels are permitted t...
 
QStringList layerIds(bool expandGroupLayers=false) const
Returns the list of layer IDs which will be rendered in the map.
 
const QgsMapToPixel & mapToPixel() const
 
QList< QgsLabelBlockingRegion > labelBlockingRegions() const
Returns the list of regions to avoid placing labels within.
 
double extentBuffer() const
Returns the buffer in map units to use around the visible extent for rendering symbols whose correspo...
 
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
 
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
 
QPolygonF visiblePolygonWithBuffer() const
Returns the visible area as a polygon (may be rotated) with extent buffer included.
 
Perform transforms between map coordinates and device coordinates.
 
void setMapRotation(double degrees, double cx, double cy)
Sets map rotation in degrees (clockwise).
 
static void drawLabelCandidateRect(pal::LabelPosition *lp, QPainter *painter, const QgsMapToPixel *xform, QList< QgsLabelCandidate > *candidates=nullptr)
 
A rectangle specified with double values.
 
void grow(double delta)
Grows the rectangle in place by the specified amount.
 
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
 
Contains information about the context of a rendering operation.
 
double convertToMapUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to map units.
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
 
bool renderingStopped() const
Returns true if the rendering operation has been stopped and any ongoing rendering should be canceled...
 
Scoped object for temporary override of the symbologyReferenceScale property of a QgsRenderContext.
 
void finalize()
Finalizes and cleans up the engine following the rendering of labels for the last layer to be labeled...
 
void run(QgsRenderContext &context) override
Runs the labeling job.
 
QgsStagedRenderLabelingEngine()
Construct the labeling engine with default settings.
 
void renderLabelsForLayer(QgsRenderContext &context, const QString &layerId)
Renders all the labels which belong only to the layer with matching layerId to the specified render c...
 
Represents a vector layer which manages a vector based data sets.
 
QgsLabelFeature * feature()
Returns the parent feature.
 
LabelPosition is a candidate feature label position.
 
FeaturePart * getFeaturePart() const
Returns the feature corresponding to this labelposition.
 
A set of features which influence the labeling process.
 
void setUpsidedownLabels(Qgis::UpsideDownLabelHandling ud)
Sets how upside down labels will be handled within the layer.
 
bool registerFeature(QgsLabelFeature *label)
Register a feature in the layer.
 
QgsAbstractLabelProvider * provider() const
Returns pointer to the associated provider.
 
void setObstacleType(QgsLabelObstacleSettings::ObstacleType obstacleType)
Sets the obstacle type, which controls how features within the layer act as obstacles for labels.
 
void setMergeConnectedLines(bool merge)
Sets whether connected lines should be merged before labeling.
 
void setCentroidInside(bool forceInside)
Sets whether labels placed at the centroid of features within the layer are forced to be placed insid...
 
Layer * addLayer(QgsAbstractLabelProvider *provider, const QString &layerName, Qgis::LabelPlacement arrangement, double defaultPriority, bool active, bool toLabel)
add a new layer
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
#define QgsDebugMsgLevel(str, level)