29 QString
type = element.attribute( QStringLiteral(
"type" ) );
30 if ( type == QLatin1String(
"rule-based" ) )
34 else if ( type == QLatin1String(
"simple" ) )
62 return QStringLiteral(
"simple" );
72 QDomElement elem = doc.createElement( QStringLiteral(
"labeling" ) );
73 elem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"simple" ) );
74 elem.appendChild( mSettings->writeXml( doc, context ) );
80 Q_UNUSED( providerId )
89 if ( !visitor->
visit( &entity ) )
97 return mSettings->format().containsAdvancedEffects();
102 QDomElement settingsElem = element.firstChildElement( QStringLiteral(
"settings" ) );
103 if ( !settingsElem.isNull() )
106 settings.
readXml( settingsElem, context );
115 double quadOffsetX = 0.5, quadOffsetY = 0.5;
118 switch ( quadrantPosition )
156 return QPointF( quadOffsetX, quadOffsetY );
162 void appendSimpleFunction( QDomDocument &doc, QDomElement &parent,
const QString &name,
const QString &attribute )
164 QDomElement
function = doc.createElement( QStringLiteral(
"ogc:Function" ) );
165 function.setAttribute( QStringLiteral(
"name" ), name );
166 parent.appendChild(
function );
167 QDomElement
property = doc.createElement( QStringLiteral(
"ogc:PropertyName" ) );
168 property.appendChild( doc.createTextNode( attribute ) );
169 function.appendChild( property );
174 std::unique_ptr<QgsMarkerSymbolLayer> layer;
175 switch ( settings.
type() )
203 switch ( settings.
type() )
221 layer.reset( marker );
224 layer->setEnabled(
true );
226 QSizeF size = settings.
size();
227 layer->setSize( std::max( 1., std::max( size.width(), size.height() ) ) );
228 layer->setSizeUnit( settings.
sizeUnit() );
234 int alpha = std::round( settings.
opacity() * 255 );
235 fillColor.setAlpha( alpha );
236 strokeColor.setAlpha( alpha );
238 layer->setFillColor( fillColor );
239 layer->setStrokeColor( strokeColor );
243 layer->setAngle( settings.
rotation() );
246 layer->setOffset( settings.
offset() );
247 layer->setOffsetUnit( settings.
offsetUnit() );
254 QDomDocument doc = parent.ownerDocument();
257 QDomElement textSymbolizerElement = doc.createElement( QStringLiteral(
"se:TextSymbolizer" ) );
258 parent.appendChild( textSymbolizerElement );
262 QFont font = format.
font();
263 QDomElement labelElement = doc.createElement( QStringLiteral(
"se:Label" ) );
264 textSymbolizerElement.appendChild( labelElement );
267 labelElement.appendChild( doc.createComment( QStringLiteral(
"SE Export for %1 not implemented yet" ).arg( settings.
getLabelExpression()->
dump() ) ) );
268 labelElement.appendChild( doc.createTextNode(
"Placeholder" ) );
272 if ( font.capitalization() == QFont::AllUppercase )
276 else if ( font.capitalization() == QFont::AllLowercase )
280 else if ( font.capitalization() == QFont::Capitalize )
286 QDomElement propertyNameElement = doc.createElement( QStringLiteral(
"ogc:PropertyName" ) );
287 propertyNameElement.appendChild( doc.createTextNode( settings.
fieldName ) );
288 labelElement.appendChild( propertyNameElement );
293 QDomElement fontElement = doc.createElement( QStringLiteral(
"se:Font" ) );
294 textSymbolizerElement.appendChild( fontElement );
298 if ( format.
font().italic() )
302 if ( format.
font().bold() )
308 QDomElement labelPlacement = doc.createElement( QStringLiteral(
"se:LabelPlacement" ) );
309 textSymbolizerElement.appendChild( labelPlacement );
310 double maxDisplacement = 0;
311 double repeatDistance = 0;
316 QDomElement pointPlacement = doc.createElement(
"se:PointPlacement" );
317 labelPlacement.appendChild( pointPlacement );
332 QDomElement rotation = doc.createElement(
"se:Rotation" );
333 pointPlacement.appendChild( rotation );
334 rotation.appendChild( doc.createTextNode( QString::number( settings.
angleOffset ) ) );
341 QDomElement pointPlacement = doc.createElement(
"se:PointPlacement" );
342 labelPlacement.appendChild( pointPlacement );
349 double offset = std::sqrt( radius * radius / 2 );
350 maxDisplacement = radius + 1;
358 QDomElement pointPlacement = doc.createElement(
"se:PointPlacement" );
359 labelPlacement.appendChild( pointPlacement );
370 QDomElement linePlacement = doc.createElement(
"se:LinePlacement" );
371 labelPlacement.appendChild( linePlacement );
374 if ( settings.
dist > 0 )
378 QDomElement perpendicular = doc.createElement(
"se:PerpendicularOffset" );
379 linePlacement.appendChild( perpendicular );
386 QDomElement repeat = doc.createElement(
"se:Repeat" );
387 linePlacement.appendChild( repeat );
388 repeat.appendChild( doc.createTextNode( QStringLiteral(
"true" ) ) );
389 QDomElement gap = doc.createElement(
"se:Gap" );
390 linePlacement.appendChild( gap );
396 QDomElement generalize = doc.createElement(
"se:GeneralizeLine" );
397 linePlacement.appendChild( generalize );
398 generalize.appendChild( doc.createTextNode( QStringLiteral(
"true" ) ) );
407 QDomElement haloElement = doc.createElement( QStringLiteral(
"se:Halo" ) );
408 textSymbolizerElement.appendChild( haloElement );
410 QDomElement radiusElement = doc.createElement( QStringLiteral(
"se:Radius" ) );
411 haloElement.appendChild( radiusElement );
416 QDomElement fillElement = doc.createElement( QStringLiteral(
"se:Fill" ) );
417 haloElement.appendChild( fillElement );
426 QDomElement fillElement = doc.createElement( QStringLiteral(
"se:Fill" ) );
427 textSymbolizerElement.appendChild( fillElement );
439 layer->writeSldMarker( doc, textSymbolizerElement, props );
446 QDomElement priorityElement = doc.createElement( QStringLiteral(
"se:Priority" ) );
447 textSymbolizerElement.appendChild( priorityElement );
448 int priority = 500 + 1000 * settings.
zIndex + ( settings.
priority - 5 ) * 100;
454 priorityElement.appendChild( doc.createTextNode( QString::number( priority ) ) );
458 if ( font.underline() )
461 textSymbolizerElement.appendChild( vo );
463 if ( font.strikeOut() )
466 textSymbolizerElement.appendChild( vo );
469 if ( maxDisplacement > 0 )
472 textSymbolizerElement.appendChild( vo );
477 textSymbolizerElement.appendChild( vo );
483 textSymbolizerElement.appendChild( vo );
486 if ( repeatDistance > 0 )
489 textSymbolizerElement.appendChild( vo );
495 textSymbolizerElement.appendChild( vo );
500 textSymbolizerElement.appendChild( vo );
505 textSymbolizerElement.appendChild( vo );
509 textSymbolizerElement.appendChild( vo );
523 resizeType = QStringLiteral(
"stretch" );
527 resizeType = QStringLiteral(
"proportional" );
530 textSymbolizerElement.appendChild( voResize );
533 QSizeF size = background.
size();
534 if ( size.width() > 0 || size.height() > 0 )
547 textSymbolizerElement.appendChild( voMargin );
563 if ( mSettings->drawLabels )
565 QDomDocument doc = parent.ownerDocument();
567 QDomElement ruleElement = doc.createElement( QStringLiteral(
"se:Rule" ) );
568 parent.appendChild( ruleElement );
571 if ( mSettings->scaleVisibility )
576 scaleProps.insert(
"scaleMinDenom",
qgsDoubleToString( mSettings->maximumScale ) );
577 scaleProps.insert(
"scaleMaxDenom",
qgsDoubleToString( mSettings->minimumScale ) );
589 Q_UNUSED( providerId )
594 mSettings.reset( settings );
QString type() const override
Unique type string of the labeling configuration implementation.
double xOffset
Horizontal offset of label.
The class is used as a container of context for various read/write operations on other objects...
QColor strokeColor() const
Returns the color used for outlining the background shape.
Shape size is determined by adding a buffer margin around text.
void toSld(QDomNode &parent, const QgsStringMap &props) const override
Writes the SE 1.1 TextSymbolizer element based on the current layer labeling settings.
double maxCurvedCharAngleOut
Maximum angle between outside curved label characters (valid range -20.0 to -95.0) ...
QgsVectorLayerLabelProvider * provider(QgsVectorLayer *layer) const override
QgsUnitTypes::RenderUnit repeatDistanceUnit
Units for repeating labels for a single feature.
static QDomElement createVendorOptionElement(QDomDocument &doc, const QString &name, const QString &value)
QSizeF size() const
Returns the size of the background shape.
double opacity() const
Returns the text's opacity.
QPointF offset() const
Returns the offset used for drawing the background shape.
QColor fillColor() const
Returns the color used for filing the background shape.
bool requiresAdvancedEffects() const override
Returns true if drawing labels requires advanced effects like composition modes, which could prevent ...
void setStrokeWidthUnit(QgsUnitTypes::RenderUnit u)
Sets the unit for the width of the marker's stroke.
double angleOffset
Label rotation, in degrees clockwise.
Simple marker symbol layer, consisting of a rendered shape with solid fill color and an stroke...
static void applyScaleDependency(QDomDocument &doc, QDomElement &ruleElem, QgsStringMap &props)
Checks if the properties contain scaleMinDenom and scaleMaxDenom, if available, they are added into t...
UpsideDownLabels upsidedownLabels
Controls whether upside down labels are displayed and how they are handled.
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point...
Arranges candidates following the curvature of a line feature. Applies to line layers only...
static QDomElement createSvgParameterElement(QDomDocument &doc, const QString &name, const QString &value)
double opacity() const
Returns the background shape's opacity.
QString dump() const
Returns an expression string, constructed from the internal abstract syntax tree. ...
double strokeWidth() const
Returns the width of the shape's stroke (stroke).
double repeatDistance
Distance for repeating labels for a single feature.
QgsVectorLayerSimpleLabeling(const QgsPalLayerSettings &settings)
Constructs simple labeling configuration with given initial settings.
Candidates are placed in predefined positions around a point. Preference is given to positions with g...
QuadrantPosition quadOffset
Sets the quadrant in which to offset labels from feature.
QgsUnitTypes::RenderUnit offsetUnits
Units for offsets of label.
QColor color() const
Returns the color that text will be rendered in.
double yOffset
Vertical offset of label.
void setStrokeWidth(double w)
Sets the width of the marker's stroke.
The QgsVectorLayerLabelProvider class implements a label provider for vector layers.
static void createDisplacementElement(QDomDocument &doc, QDomElement &element, QPointF offset)
bool mergeLines
true if connected line features with identical label text should be merged prior to generating label ...
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
static QgsVectorLayerSimpleLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Create the instance from a DOM element with saved configuration.
Shape size is determined by percent of text size.
Container for settings relating to a text background object.
An interface for classes which can visit style entity (e.g.
QgsAbstractVectorLayerLabeling * clone() const override
Returns a new copy of the object.
QMap< QString, QString > QgsStringMap
double maxCurvedCharAngleIn
Maximum angle between inside curved label characters (valid range 20.0 to 60.0).
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)
ShapeType type() const
Returns the type of background shape (e.g., square, ellipse, SVG).
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
double zIndex
Z-Index of label, where labels with a higher z-index are rendered on top of labels with a lower z-ind...
Arranges horizontal candidates scattered throughout a polygon feature. Applies to polygon layers only...
static double rescaleUom(double size, QgsUnitTypes::RenderUnit unit, const QgsStringMap &props)
Rescales the given size based on the uomScale found in the props, if any is found, otherwise returns the value un-modified.
Shape rotation is a fixed angle.
void setStrokeWidthUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the stroke width.
bool displayAll
If true, all features will be labelled even when overlaps occur.
std::unique_ptr< QgsMarkerSymbolLayer > backgroundToMarkerLayer(const QgsTextBackgroundSettings &settings)
virtual QgsPalLayerSettings settings(const QString &providerId=QString()) const =0
Gets associated label settings.
RotationType rotationType() const
Returns the method used for rotating the background shape.
Show upside down for all labels, including dynamic ones.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the labeling...
virtual QgsSymbolLayer * clone() const =0
Shall be reimplemented by subclasses to create a deep copy of the instance.
Arranges candidates in a circle around a point (or centroid of a polygon). Applies to point or polygo...
QString svgFile() const
Returns the absolute path to the background SVG file, if set.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
void setStrokeWidth(double w)
double opacity() const
Returns the buffer opacity.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
QgsUnitTypes::RenderUnit strokeWidthUnit() const
Returns the units used for the shape's stroke width.
void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString()) override
Set pal settings (takes ownership).
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc...
static QgsRuleBasedLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Create the instance from a DOM element with saved configuration.
QgsUnitTypes::RenderUnit offsetUnit() const
Returns the units used for the shape's offset.
double rotation() const
Returns the rotation for the background shape, in degrees clockwise.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
QgsExpression * getLabelExpression()
Returns the QgsExpression for this label settings.
Arranges candidates parallel to a generalised line representing the feature or parallel to a polygon'...
void setShape(QgsSimpleMarkerSymbolLayerBase::Shape shape)
Sets the rendered marker shape.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the buffer size.
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const override
Returns labeling configuration as XML element.
QColor color() const
Returns the color of the buffer.
Shape
Marker symbol shapes.
double size() const
Returns the size of the buffer.
static void createAnchorPointElement(QDomDocument &doc, QDomElement &element, QPointF anchor)
Creates a SE 1.1 anchor point element as a child of the specified element.
Container for settings relating to a text buffer.
double dist
Distance from feature to the label.
double size() const
Returns the size for rendered text.
A label settings entity for QgsStyle databases.
bool enabled() const
Returns whether the background is enabled.
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
QPointF quadOffsetToSldAnchor(QgsPalLayerSettings::QuadrantPosition quadrantPosition)
virtual void writeTextSymbolizer(QDomNode &parent, QgsPalLayerSettings &settings, const QgsStringMap &props) const
Writes a TextSymbolizer element contents based on the provided labeling settings. ...
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
bool enabled() const
Returns whether the buffer is enabled.
Basic implementation of the labeling interface.
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified symbology visitor, causing it to visit all symbols associated with the labeling...
bool isExpression
true if this label is made from a expression string, e.g., FieldName || 'mm'
QgsPalLayerSettings settings(const QString &providerId=QString()) const override
Gets associated label settings.
virtual QString type() const =0
Unique type string of the labeling configuration implementation.
Container for all settings relating to text rendering.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
Represents a vector layer which manages a vector based data sets.
Arranges candidates following the curvature of a polygon's boundary. Applies to polygon layers only...
Square - buffered sizes only.
QFont font() const
Returns the font used for rendering text.
void appendSimpleFunction(QDomDocument &doc, QDomElement &parent, const QString &name, const QString &attribute)
int priority
Label priority.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
bool labelPerPart
true if every part of a multi-part feature should be labeled.
QgsUnitTypes::RenderUnit distUnits
Units the distance from feature to the label.
static QgsAbstractVectorLayerLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Try to create instance of an implementation based on the XML data.
RenderUnit
Rendering size units.
QgsMarkerSymbol * markerSymbol() const
Returns the marker symbol to be rendered in the background.
QString fieldName
Name of field (or an expression) to use for label text.
Arranges candidates scattered throughout a polygon feature. Candidates are rotated to respect the pol...