46 mDistanceMapUnitScale =
scale;
53 return mDistanceMapUnitScale;
61 if (
properties.contains( QStringLiteral(
"x_attribute" ) ) )
65 if (
properties.contains( QStringLiteral(
"y_attribute" ) ) )
69 if (
properties.contains( QStringLiteral(
"distance_unit" ) ) )
73 if (
properties.contains( QStringLiteral(
"distance_map_unit_scale" ) ) )
77 if (
properties.contains( QStringLiteral(
"scale" ) ) )
81 if (
properties.contains( QStringLiteral(
"vector_field_type" ) ) )
85 if (
properties.contains( QStringLiteral(
"angle_orientation" ) ) )
89 if (
properties.contains( QStringLiteral(
"angle_units" ) ) )
93 if (
properties.contains( QStringLiteral(
"size" ) ) )
97 if (
properties.contains( QStringLiteral(
"size_unit" ) ) )
101 if (
properties.contains( QStringLiteral(
"size_map_unit_scale" ) ) )
105 if (
properties.contains( QStringLiteral(
"offset" ) ) )
109 if (
properties.contains( QStringLiteral(
"offset_unit" ) ) )
113 if (
properties.contains( QStringLiteral(
"offset_map_unit_scale" ) ) )
143 line << QPointF( 0, 50 );
144 line << QPointF( 100, 50 );
145 mLineSymbol->renderPolyline( line,
nullptr, context.
renderContext() );
151 double xComponent = 0;
152 double yComponent = 0;
157 xVal = f.
attribute( mXIndex ).toDouble();
162 yVal = f.
attribute( mYIndex ).toDouble();
172 switch ( mVectorFieldType )
176 destPoint = QPointF( point.x() + mScale * ctx.
convertToPainterUnits( xVal, mDistanceUnit, mDistanceMapUnitScale ),
183 convertPolarToCartesian( xVal, yVal, xComponent, yComponent );
184 destPoint = QPointF( point.x() + mScale * ctx.
convertToPainterUnits( xComponent, mDistanceUnit, mDistanceMapUnitScale ),
185 point.y() - mScale * ctx.
convertToPainterUnits( yComponent, mDistanceUnit, mDistanceMapUnitScale ) );
191 destPoint = QPointF( point.x(), point.y() - ( mScale * ctx.
convertToPainterUnits( yVal, mDistanceUnit, mDistanceMapUnitScale ) ) );
198 const double radians = mapRotation * M_PI / 180.0;
199 destPoint = QPointF( cos( radians ) * ( destPoint.x() - point.x() ) - sin( radians ) * ( destPoint.y() - point.y() ) + point.x(),
200 sin( radians ) * ( destPoint.x() - point.x() ) + cos( radians ) * ( destPoint.y() - point.y() ) + point.y() );
204 mLineSymbol->renderPolyline( line, &f, context.
renderContext() );
248 properties[QStringLiteral(
"x_attribute" )] = mXAttribute;
249 properties[QStringLiteral(
"y_attribute" )] = mYAttribute;
252 properties[QStringLiteral(
"scale" )] = QString::number( mScale );
253 properties[QStringLiteral(
"vector_field_type" )] = QString::number( mVectorFieldType );
254 properties[QStringLiteral(
"angle_orientation" )] = QString::number( mAngleOrientation );
255 properties[QStringLiteral(
"angle_units" )] = QString::number( mAngleUnits );
274 element.appendChild( doc.createComment( QStringLiteral(
"VectorField not implemented yet..." ) ) );
275 mLineSymbol->toSld( doc, element, props );
295 if ( !mXAttribute.isEmpty() )
297 attributes.insert( mXAttribute );
299 if ( !mYAttribute.isEmpty() )
301 attributes.insert( mYAttribute );
305 attributes.unite( mLineSymbol->usedAttributes( context ) );
314 if ( mLineSymbol && mLineSymbol->hasDataDefinedProperties() )
319 void QgsVectorFieldSymbolLayer::convertPolarToCartesian(
double length,
double angle,
double &x,
double &y )
const
339 x = length * std::sin(
angle );
340 y = length * std::cos(
angle );
346 mLineSymbol->setColor(
color );
353 return mLineSymbol ? mLineSymbol->color() :
mColor;
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
Container of fields for a vector layer.
bool isEmpty() const
Checks whether the container is empty.
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
A line symbol type, for rendering LineString and MultiLineString geometries.
Perform transforms between map coordinates and device coordinates.
double mapRotation() const
Returns current map rotation in degrees (clockwise)
Struct for storing maximum and minimum scales for measurements in map units.
virtual void setSize(double size)
Sets the symbol size.
QgsUnitTypes::RenderUnit mOffsetUnit
Offset units.
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's size.
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
QPointF mOffset
Marker offset.
QgsMapUnitScale mapUnitScale() const override
void setOffset(QPointF offset)
Sets the marker's offset, which is the horizontal and vertical displacement which the rendered marker...
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's size.
double size() const
Returns the symbol size.
QgsMapUnitScale mOffsetMapUnitScale
Offset map unit scale.
QgsMapUnitScale mSizeMapUnitScale
Marker size map unit scale.
QgsUnitTypes::RenderUnit mSizeUnit
Marker size unit.
void setOffsetUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the symbol's offset.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for the symbol's offset.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
double angle() const
Returns the rotation angle for the marker, in degrees clockwise from north.
void setMapUnitScale(const QgsMapUnitScale &scale) override
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
const QgsMapToPixel & mapToPixel() const
Returns the context's map to pixel transform, which transforms between map coordinates and device coo...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static QString encodePoint(QPointF point)
Encodes a QPointF to a string.
static QPointF decodePoint(const QString &string)
Decodes a QSizeF from a string.
virtual QSet< QString > usedAttributes(const QgsRenderContext &context) const
Returns the set of attributes referenced by the layer.
virtual bool hasDataDefinedProperties() const
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
virtual bool setSubSymbol(QgsSymbol *symbol)
Sets layer's subsymbol. takes ownership of the passed symbol.
QgsFields fields() const
Fields of the layer.
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
const QgsFeature * feature() const
Returns the current feature being rendered.
Abstract base class for all rendered symbols.
SymbolType type() const
Returns the symbol's type.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
RenderUnit
Rendering size units.
@ RenderUnknownUnit
Mixed or unknown units.
@ RenderMetersInMapUnits
Meters value as Map units.
@ RenderMapUnits
Map units.
A symbol layer class for displaying displacement arrows based on point layer attributes.
QSet< QString > usedAttributes(const QgsRenderContext &context) const override
Returns the set of attributes referenced by the layer.
bool setSubSymbol(QgsSymbol *symbol) override
Sets layer's subsymbol. takes ownership of the passed symbol.
QColor color() const override
The fill color.
QgsUnitTypes::RenderUnit outputUnit() const override
Returns the units to use for sizes and widths within the symbol layer.
void setMapUnitScale(const QgsMapUnitScale &scale) override
void setYAttribute(const QString &attribute)
void setAngleUnits(AngleUnits units)
void setVectorFieldType(VectorFieldType type)
void setDistanceUnit(QgsUnitTypes::RenderUnit unit)
Sets the units for the distance.
bool hasDataDefinedProperties() const override
Returns true if the symbol layer (or any of its sub-symbols) contains data defined properties.
void startRender(QgsSymbolRenderContext &context) override
Called before a set of rendering operations commences on the supplied render context.
void setAngleOrientation(AngleOrientation orientation)
QVariantMap properties() const override
Should be reimplemented by subclasses to return a string map that contains the configuration informat...
void stopRender(QgsSymbolRenderContext &context) override
Called after a set of rendering operations has finished on the supplied render context.
QgsVectorFieldSymbolLayer * clone() const override
Shall be reimplemented by subclasses to create a deep copy of the instance.
QgsVectorFieldSymbolLayer()
static QgsSymbolLayer * create(const QVariantMap &properties=QVariantMap())
Creates the symbol layer.
QgsMapUnitScale mapUnitScale() const override
void setXAttribute(const QString &attribute)
void setDistanceMapUnitScale(const QgsMapUnitScale &scale)
bool usesMapUnits() const override
Returns true if the symbol layer has any components which use map unit based sizes.
@ CounterclockwiseFromEast
void setOutputUnit(QgsUnitTypes::RenderUnit unit) override
Sets the units to use for sizes and widths within the symbol layer.
static QgsSymbolLayer * createFromSld(QDomElement &element)
void setColor(const QColor &color) override
The fill color.
void toSld(QDomDocument &doc, QDomElement &element, const QVariantMap &props) const override
Saves the symbol layer as SLD.
void renderPoint(QPointF point, QgsSymbolRenderContext &context) override
Renders a marker at the specified point.
void drawPreviewIcon(QgsSymbolRenderContext &context, QSize size) override
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 qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)