28 QString
type = element.attribute( QStringLiteral(
"type" ) );
29 if ( type == QLatin1String(
"rule-based" ) )
33 else if ( type == QLatin1String(
"simple" ) )
56 return QStringLiteral(
"simple" );
66 QDomElement elem = doc.createElement( QStringLiteral(
"labeling" ) );
67 elem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"simple" ) );
68 elem.appendChild( mSettings->writeXml( doc, context ) );
74 Q_UNUSED( providerId );
80 return mSettings->format().containsAdvancedEffects();
85 QDomElement settingsElem = element.firstChildElement( QStringLiteral(
"settings" ) );
86 if ( !settingsElem.isNull() )
89 settings.
readXml( settingsElem, context );
98 double quadOffsetX = 0.5, quadOffsetY = 0.5;
101 switch ( quadrantPosition )
139 return QPointF( quadOffsetX, quadOffsetY );
145 void appendSimpleFunction( QDomDocument &doc, QDomElement &parent,
const QString &name,
const QString &attribute )
147 QDomElement
function = doc.createElement( QStringLiteral(
"ogc:Function" ) );
148 function.setAttribute( QStringLiteral(
"name" ), name );
149 parent.appendChild(
function );
150 QDomElement
property = doc.createElement( QStringLiteral(
"ogc:PropertyName" ) );
151 property.appendChild( doc.createTextNode( attribute ) );
152 function.appendChild( property );
157 std::unique_ptr<QgsMarkerSymbolLayer> layer;
158 switch ( settings.
type() )
176 switch ( settings.
type() )
193 layer.reset( marker );
196 layer->setEnabled(
true );
198 QSizeF size = settings.
size();
199 layer->setSize( std::max( 1., std::max( size.width(), size.height() ) ) );
200 layer->setSizeUnit( settings.
sizeUnit() );
206 int alpha = std::round( settings.
opacity() * 255 );
207 fillColor.setAlpha( alpha );
208 strokeColor.setAlpha( alpha );
210 layer->setFillColor( fillColor );
211 layer->setStrokeColor( strokeColor );
215 layer->setAngle( settings.
rotation() );
218 layer->setOffset( settings.
offset() );
219 layer->setOffsetUnit( settings.
offsetUnit() );
226 QDomDocument doc = parent.ownerDocument();
229 QDomElement textSymbolizerElement = doc.createElement( QStringLiteral(
"se:TextSymbolizer" ) );
230 parent.appendChild( textSymbolizerElement );
234 QFont font = format.
font();
235 QDomElement labelElement = doc.createElement( QStringLiteral(
"se:Label" ) );
236 textSymbolizerElement.appendChild( labelElement );
239 labelElement.appendChild( doc.createComment( QStringLiteral(
"SE Export for %1 not implemented yet" ).arg( settings.
getLabelExpression()->
dump() ) ) );
240 labelElement.appendChild( doc.createTextNode(
"Placeholder" ) );
244 if ( font.capitalization() == QFont::AllUppercase )
248 else if ( font.capitalization() == QFont::AllLowercase )
252 else if ( font.capitalization() == QFont::Capitalize )
258 QDomElement propertyNameElement = doc.createElement( QStringLiteral(
"ogc:PropertyName" ) );
259 propertyNameElement.appendChild( doc.createTextNode( settings.
fieldName ) );
260 labelElement.appendChild( propertyNameElement );
265 QDomElement fontElement = doc.createElement( QStringLiteral(
"se:Font" ) );
266 textSymbolizerElement.appendChild( fontElement );
270 if ( format.
font().italic() )
274 if ( format.
font().bold() )
280 QDomElement labelPlacement = doc.createElement( QStringLiteral(
"se:LabelPlacement" ) );
281 textSymbolizerElement.appendChild( labelPlacement );
282 double maxDisplacement = 0;
283 double repeatDistance = 0;
288 QDomElement pointPlacement = doc.createElement(
"se:PointPlacement" );
289 labelPlacement.appendChild( pointPlacement );
304 QDomElement rotation = doc.createElement(
"se:Rotation" );
305 pointPlacement.appendChild( rotation );
306 rotation.appendChild( doc.createTextNode( QString::number( settings.
angleOffset ) ) );
313 QDomElement pointPlacement = doc.createElement(
"se:PointPlacement" );
314 labelPlacement.appendChild( pointPlacement );
321 double offset = std::sqrt( radius * radius / 2 );
322 maxDisplacement = radius + 1;
330 QDomElement pointPlacement = doc.createElement(
"se:PointPlacement" );
331 labelPlacement.appendChild( pointPlacement );
342 QDomElement linePlacement = doc.createElement(
"se:LinePlacement" );
343 labelPlacement.appendChild( linePlacement );
346 if ( settings.
dist > 0 )
350 QDomElement perpendicular = doc.createElement(
"se:PerpendicularOffset" );
351 linePlacement.appendChild( perpendicular );
358 QDomElement repeat = doc.createElement(
"se:Repeat" );
359 linePlacement.appendChild( repeat );
360 repeat.appendChild( doc.createTextNode( QStringLiteral(
"true" ) ) );
361 QDomElement gap = doc.createElement(
"se:Gap" );
362 linePlacement.appendChild( gap );
368 QDomElement generalize = doc.createElement(
"se:GeneralizeLine" );
369 linePlacement.appendChild( generalize );
370 generalize.appendChild( doc.createTextNode( QStringLiteral(
"true" ) ) );
379 QDomElement haloElement = doc.createElement( QStringLiteral(
"se:Halo" ) );
380 textSymbolizerElement.appendChild( haloElement );
382 QDomElement radiusElement = doc.createElement( QStringLiteral(
"se:Radius" ) );
383 haloElement.appendChild( radiusElement );
388 QDomElement fillElement = doc.createElement( QStringLiteral(
"se:Fill" ) );
389 haloElement.appendChild( fillElement );
398 QDomElement fillElement = doc.createElement( QStringLiteral(
"se:Fill" ) );
399 textSymbolizerElement.appendChild( fillElement );
411 layer->writeSldMarker( doc, textSymbolizerElement, props );
418 QDomElement priorityElement = doc.createElement( QStringLiteral(
"se:Priority" ) );
419 textSymbolizerElement.appendChild( priorityElement );
420 int priority = 500 + 1000 * settings.
zIndex + ( settings.
priority - 5 ) * 100;
426 priorityElement.appendChild( doc.createTextNode( QString::number( priority ) ) );
430 if ( font.underline() )
433 textSymbolizerElement.appendChild( vo );
435 if ( font.strikeOut() )
438 textSymbolizerElement.appendChild( vo );
441 if ( maxDisplacement > 0 )
444 textSymbolizerElement.appendChild( vo );
449 textSymbolizerElement.appendChild( vo );
455 textSymbolizerElement.appendChild( vo );
458 if ( repeatDistance > 0 )
461 textSymbolizerElement.appendChild( vo );
467 textSymbolizerElement.appendChild( vo );
472 textSymbolizerElement.appendChild( vo );
477 textSymbolizerElement.appendChild( vo );
481 textSymbolizerElement.appendChild( vo );
495 resizeType = QStringLiteral(
"stretch" );
499 resizeType = QStringLiteral(
"proportional" );
502 textSymbolizerElement.appendChild( voResize );
505 QSizeF size = background.
size();
506 if ( size.width() > 0 || size.height() > 0 )
519 textSymbolizerElement.appendChild( voMargin );
535 if ( mSettings->drawLabels )
537 QDomDocument doc = parent.ownerDocument();
539 QDomElement ruleElement = doc.createElement( QStringLiteral(
"se:Rule" ) );
540 parent.appendChild( ruleElement );
543 if ( mSettings->scaleVisibility )
548 scaleProps.insert(
"scaleMinDenom",
qgsDoubleToString( mSettings->maximumScale ) );
549 scaleProps.insert(
"scaleMaxDenom",
qgsDoubleToString( mSettings->minimumScale ) );
561 Q_UNUSED( providerId );
566 mSettings.reset( settings );
QgsUnitTypes::RenderUnit strokeWidthUnit() const
Returns the units used for the shape's stroke width.
ShapeType type() const
Returns the type of background shape (e.g., square, ellipse, SVG).
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...
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) ...
QPointF offset() const
Returns the offset used for drawing the background shape.
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)
QFont font() const
Returns the font used for rendering text.
QSizeF size() const
Returns the size of the background shape.
double opacity() const
Returns the buffer opacity.
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...
void readXml(QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
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.
static QDomElement createSvgParameterElement(QDomDocument &doc, const QString &name, const QString &value)
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the buffer size.
double repeatDistance
Distance for repeating labels for a single feature.
QgsVectorLayerSimpleLabeling(const QgsPalLayerSettings &settings)
Constructs simple labeling configuration with given initial settings.
virtual void writeTextSymbolizer(QDomNode &parent, QgsPalLayerSettings &settings, const QgsStringMap &props) const
Writes a TextSymbolizer element contents based on the provided labeling 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.
double size() const
Returns the size for rendered text.
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)
QgsUnitTypes::RenderUnit offsetUnit() const
Returns the units used for the shape's offset.
bool mergeLines
True if connected line features with identical label text should be merged prior to generating label ...
static QgsVectorLayerSimpleLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Create the instance from a DOM element with saved configuration.
QString dump() const
Returns an expression string, constructed from the internal abstract syntax tree. ...
bool enabled() const
Returns whether the background is enabled.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc...
Shape size is determined by percent of text size.
double opacity() const
Returns the text's opacity.
QColor color() const
Returns the color that text will be rendered in.
Container for settings relating to a text background object.
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).
QColor color() const
Returns the color of the buffer.
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)
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 candidates following the curvature of a line feature. Applies to line layers only...
QColor strokeColor() const
Returns the color used for outlining the background shape.
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.
bool enabled() const
Returns whether the buffer is enabled.
std::unique_ptr< QgsMarkerSymbolLayer > backgroundToMarkerLayer(const QgsTextBackgroundSettings &settings)
virtual QgsPalLayerSettings settings(const QString &providerId=QString()) const =0
Gets associated label settings.
Show upside down for all labels, including dynamic ones.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
QString svgFile() const
Returns the absolute path to the background SVG file, if set.
Arranges candidates in a circle around a point (or centroid of a polygon). Applies to point or polygo...
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 background shape's opacity.
void setSettings(QgsPalLayerSettings *settings, const QString &providerId=QString()) override
Set pal settings (takes ownership).
static QgsRuleBasedLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Create the instance from a DOM element with saved configuration.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
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...
void setShape(QgsSimpleMarkerSymbolLayerBase::Shape shape)
Sets the rendered marker shape.
QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const override
Returns labeling configuration as XML element.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
Shape
Marker symbol shapes.
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.
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
QPointF quadOffsetToSldAnchor(QgsPalLayerSettings::QuadrantPosition quadrantPosition)
RotationType rotationType() const
Returns the method used for rotating the background shape.
double size() const
Returns the size of the buffer.
Basic implementation of the labeling interface.
double rotation() const
Returns the rotation for the background shape, in degrees clockwise.
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.
Represents a vector layer which manages a vector based data sets.
Square - buffered sizes only.
double strokeWidth() const
Returns the width of the shape's stroke (stroke).
QColor fillColor() const
Returns the color used for filing the background shape.
void appendSimpleFunction(QDomDocument &doc, QDomElement &parent, const QString &name, const QString &attribute)
int priority
Label priority.
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.
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...