40 , mLayerGeometryType( layer->geometryType() )
41 , mRenderer( layer->renderer() )
42 , mFields( layer->fields() )
43 , mCrs( layer->
crs() )
45 mName = layerName.isEmpty() ? layer->
id() : layerName;
47 if ( withFeatureLoop )
153 attributeNames.insert( name );
212 QSet<QString> attrNames;
213 if ( !
prepare( ctx, attrNames ) )
214 return QList<QgsLabelFeature *>();
242 if ( !symbols.isEmpty() )
274 std::unique_ptr< QgsAbstractGeometry > obstacleGeom;
276 obstacleGeom = qgis::make_unique< QgsMultiPolygon >();
306 if ( bounds.isValid() )
307 bounds = bounds.united( static_cast< QgsMarkerSymbol * >( symbol )->bounds( pt, context, fet ) );
309 bounds =
static_cast< QgsMarkerSymbol *
>( symbol )->bounds( pt, context, fet );
314 QVector< double > bX;
315 bX << bounds.left() << bounds.right() << bounds.right() << bounds.left();
316 QVector< double > bY;
317 bY << bounds.top() << bounds.top() << bounds.bottom() << bounds.bottom();
318 std::unique_ptr< QgsLineString > boundLineString = qgis::make_unique< QgsLineString >( bX, bY );
322 for (
int i = 0; i < boundLineString->numPoints(); ++i )
325 static_cast<int>( boundLineString->yAt( i ) ) );
326 boundLineString->setXAt( i, point.
x() );
327 boundLineString->setYAt( i, point.
y() );
340 boundLineString->close();
345 boundLineString->filterVertices( [](
const QgsPoint & point )->
bool 347 return std::isfinite( point.
x() ) && std::isfinite( point.
y() );
349 if ( !boundLineString->isRing() )
353 std::unique_ptr< QgsPolygon > obstaclePolygon = qgis::make_unique< QgsPolygon >();
354 obstaclePolygon->setExteriorRing( boundLineString.release() );
358 static_cast<QgsMultiPolygon *
>( obstacleGeom.get() )->addGeometry( obstaclePolygon.release() );
362 obstacleGeom = std::move( obstaclePolygon );
382 const QMap< QgsPalLayerSettings::Property, QVariant > &ddValues = lf->
dataDefinedValues();
387 QgsDebugMsgLevel( QStringLiteral(
"PAL font definedFont: %1, Style: %2" ).arg( dFont.toString(), dFont.styleName() ), 4 );
394 format.
setSize( dFont.pixelSize() );
403 case LabelPosition::QuadrantAboveLeft:
404 case LabelPosition::QuadrantLeft:
405 case LabelPosition::QuadrantBelowLeft:
408 case LabelPosition::QuadrantAbove:
409 case LabelPosition::QuadrantOver:
410 case LabelPosition::QuadrantBelow:
413 case LabelPosition::QuadrantAboveRight:
414 case LabelPosition::QuadrantRight:
415 case LabelPosition::QuadrantBelowRight:
422 QgsPalLabeling::dataDefinedTextStyle( tmpLyr, ddValues );
425 QgsPalLabeling::dataDefinedTextBuffer( tmpLyr, ddValues );
428 QgsPalLabeling::dataDefinedTextFormatting( tmpLyr, ddValues );
431 QgsPalLabeling::dataDefinedShapeBackground( tmpLyr, ddValues );
434 QgsPalLabeling::dataDefinedDropShadow( tmpLyr, ddValues );
480 QPainter *painter = context.
painter();
498 QRectF rect( 0, 0, outPt2.
x() - outPt.x(), outPt2.
y() - outPt.y() );
500 painter->setRenderHint( QPainter::Antialiasing,
false );
501 painter->translate( QPointF( outPt.x(), outPt.y() ) );
502 painter->rotate( -label->
getAlpha() * 180 / M_PI );
506 painter->setBrush( QColor( 255, 0, 0, 100 ) );
507 painter->setPen( QColor( 255, 0, 0, 150 ) );
511 painter->setBrush( QColor( 0, 255, 0, 100 ) );
512 painter->setPen( QColor( 0, 255, 0, 150 ) );
515 painter->drawRect( rect );
524 QgsTextRenderer::Component component;
525 component.dpiRatio = dpiRatio;
526 component.origin = outPt;
527 component.rotation = label->
getAlpha();
534 QPointF centerPt( outPt );
538 double xc = outPt2.
x() - outPt.x();
539 double yc = outPt2.
y() - outPt.y();
541 double angle = -component.rotation;
542 double xd = xc * std::cos( angle ) - yc * std::sin( angle );
543 double yd = xc * std::sin( angle ) + yc * std::cos( angle );
545 centerPt.setX( centerPt.x() + xd );
546 centerPt.setY( centerPt.y() + yd );
548 component.center = centerPt;
554 component.size = QSizeF( labelWidthPx, labelHeightPx );
572 bool prependSymb =
false;
598 symb = symb + QStringLiteral(
"\n" );
603 symb = QStringLiteral(
"\n" ) + symb;
625 QgsTextRenderer::Component component;
626 component.origin = outPt;
627 component.rotation = label->
getAlpha();
629 QgsTextRenderer::drawTextInternal( drawType, context, tmpLyr.
format(), component, multiLineList, labelfm,
Class for parsing and evaluation of expressions (formerly called "search strings").
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.
bool hasEvalError() const
Returns true if an error occurred when evaluating last input.
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 name() const
Name of the layer (for statistics, debugging etc.) - does not need to be unique.
A rectangle specified with double values.
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)
QFont font() const
Returns the font used for rendering text.
QgsPalLayerSettings::Placement mPlacement
Placement strategy.
Abstract base class for all rendered symbols.
QgsLabelFeature * feature()
Returns the parent feature.
void registerFeature(QgsFeature &f, QgsRenderContext &context, QgsLabelFeature **labelFeature=nullptr, QgsGeometry obstacleGeometry=QgsGeometry())
Register a feature for labeling.
const QgsLabelingEngine * mEngine
Associated labeling engine.
Draw shadow under buffer.
UpsideDownLabels upsidedownLabels
Controls whether upside down labels are displayed and how they are handled.
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.
bool mOwnsSource
Whether layer's feature source is owned.
QgsTextShadowSettings & shadow()
Returns a reference to the text drop shadow settings.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
A class to represent a 2D point.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
OperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
HAlignment
Horizontal alignment.
bool obstacle
True if features for layer are obstacles to labels of other layers.
void setFont(const QFont &font)
Sets the font used for rendering text.
void drawLabelPrivate(pal::LabelPosition *label, QgsRenderContext &context, QgsPalLayerSettings &tmpLyr, QgsTextRenderer::TextPart drawType, double dpiRatio=1.0) const
Internal label drawing method.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest())=0
Gets an iterator for features matching the specified request.
Class that adds extra information to QgsLabelFeature for text labels.
bool addDirectionSymbol
If true, '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) will be ...
A geometry is the spatial representation of a feature.
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 ...
const QgsRectangle & extent() const
When rendering a map layer, calling this method returns the "clipping" extent for the layer (in the l...
const QgsMapToPixel & mapToPixel() const
MultiLineAlign multilineAlign
Horizontal alignment of multi-line labels.
bool enabled() const
Returns whether the background is enabled.
Whether to label each part of multi-part features separately.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc...
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
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...
const QgsCoordinateReferenceSystem & crs
int autoWrapLength
If non-zero, indicates that label text should be automatically wrapped to (ideally) the specified num...
bool enabled() const
Returns whether the shadow is enabled.
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)
bool reverseDirectionSymbol
True if direction symbols should be reversed.
A marker symbol type, for rendering Point and MultiPoint geometries.
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
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) ...
void init()
initialization method - called from constructors
bool hasFixedPosition() const
Whether the label should use a fixed position instead of being automatically placed.
bool conflictsWithObstacle() const
Returns whether the position is marked as conflicting with an obstacle feature.
Perform transforms between map coordinates and device coordinates.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
bool prepare(const QgsExpressionContext &context=QgsExpressionContext()) const override
Prepares the collection against a specified expression context.
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
ObstacleType obstacleType
Controls how features act as obstacles for labels.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QList< QgsSymbol * > QgsSymbolList
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
bool displayAll
If true, all features will be labelled even when overlaps occur.
void setSize(double size)
Sets the size for rendered text.
bool enabled() const
Returns whether the buffer is enabled.
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)
bool testFlag(Flag f) const
Test whether a particular flag is enabled.
QgsLabelingResults * results() const
For internal use by the providers.
Quadrant getQuadrant() const
QgsPalLayerSettings mSettings
Layer's labeling configuration.
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant > & dataDefinedValues() const
Gets data-defined values.
double getY(int i=0) const
Returns the down-left y coordinate.
QgsPointXY center() const
Returns the center point of the rectangle.
const QgsMapToPixel * xform
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.
Whether location of centroid must be inside of polygons.
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.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
virtual QgsSymbolList originalSymbolsForFeature(const QgsFeature &feature, QgsRenderContext &context) const
Equivalent of originalSymbolsForFeature() call extended to support renderers that may use more symbol...
LabelPosition * getNextPart() const
Whether all features will be labelled even though overlaps occur.
virtual void registerFeature(QgsFeature &feature, QgsRenderContext &context, const QgsGeometry &obstacleGeometry=QgsGeometry())
Register a feature for labeling as one or more QgsLabelFeature objects stored into mLabels...
QgsPointXY toMapCoordinates(int x, int y) const
Transform device coordinates to map (world) coordinates.
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
Single scope for storing variables and functions for use within a QgsExpressionContext.
double getX(int i=0) const
Returns the down-left x coordinate.
Point geometry type, with support for z-dimension and m-values.
The QgsAbstractLabelProvider class is an interface class.
Partial snapshot of vector layer's state (only the members necessary for access to features) ...
Place direction symbols on above label.
Draw shadow below all text components.
const QgsMapSettings & mapSettings() const
Gets associated map settings.
QgsExpressionContext & expressionContext()
Gets the expression context.
double getAlpha() const
Returns the angle to rotate text (in rad).
QString wrapChar
Wrapping character string.
TextPart
Components of text.
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext()) const override
Returns the set of any fields referenced by the active properties from the collection.
QgsFields mFields
Layer's fields.
QgsAbstractFeatureSource * mSource
Layer's feature source.
QString rightDirectionSymbol
String to use for right direction arrows.
QgsExpression * getLabelExpression()
Returns the QgsExpression for this label settings.
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point...
Contains information about the context of a rendering operation.
QFont definedFont()
Font to be used for rendering.
const QgsLabelingEngineSettings & engineSettings() const
Gets associated labeling engine settings.
QString text(int partId) const
Returns the text component corresponding to a specified label part.
QPainter * painter()
Returns the destination QPainter for the render operation.
The QgsLabelFeature class describes a feature that should be used within the labeling engine...
Multi polygon geometry collection.
QString mName
Name of the layer.
Struct for storing maximum and minimum scales for measurements in map units.
QgsCoordinateReferenceSystem mCrs
Layer's CRS.
virtual void startRender(QgsRenderContext &context, const QgsFields &fields)
Must be called when a new render cycle is started.
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
~QgsVectorLayerLabelProvider() override
bool hasGeometry() const
Returns true if the feature has an associated geometry.
SymbolType type() const
Returns the symbol's type.
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.
QgsPalLayerSettings::ObstacleType mObstacleType
Type of the obstacle of feature geometries.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
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 isExpression
True if this label is made from a expression string, e.g., FieldName || 'mm'.
Custom exception class for Coordinate Reference System related exceptions.
QgsCoordinateTransform coordinateTransform() const
Returns the current coordinate transform for the context.
QgsExpressionContextScope * popScope()
Removes the last scope from the expression context and return it.
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.
Represents a vector layer which manages a vector based data sets.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
QgsWkbTypes::GeometryType type() const
Returns type of the geometry as a QgsWkbTypes::GeometryType.
QString mLayerId
Associated layer's ID, if applicable.
QgsTextShadowSettings::ShadowPlacement shadowPlacement() const
Returns the placement for the drop shadow.
QString labelText() const
Text of the label.
QString evalErrorString() const
Returns evaluation error.
int priority
Label priority.
QgsFeatureRenderer * mRenderer
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
bool useMaxLineLengthForAutoWrap
If true, indicates that when auto wrapping label text the autoWrapLength length indicates the maximum...
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)...
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the label's property collection, used for data defined overrides.
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.
QgsFeatureId featureId() const
Returns the unique ID of the feature.
QString fieldName
Name of field (or an expression) to use for label text.
DirectionSymbols placeDirectionSymbol
Placement option for direction symbols.