22 QString QgsSnapToGridAlgorithm::name()
const 24 return QStringLiteral(
"snappointstogrid" );
27 QString QgsSnapToGridAlgorithm::displayName()
const 29 return QObject::tr(
"Snap points to grid" );
32 QStringList QgsSnapToGridAlgorithm::tags()
const 34 return QObject::tr(
"snapped,grid,simplify,round,precision" ).split(
',' );
37 QString QgsSnapToGridAlgorithm::group()
const 39 return QObject::tr(
"Vector geometry" );
42 QString QgsSnapToGridAlgorithm::groupId()
const 44 return QStringLiteral(
"vectorgeometry" );
47 QString QgsSnapToGridAlgorithm::outputName()
const 49 return QObject::tr(
"Snapped" );
52 QString QgsSnapToGridAlgorithm::shortHelpString()
const 54 return QObject::tr(
"This algorithm modifies the coordinates of geometries in a vector layer, so that all points " 55 "or vertices are snapped to the closest point of the grid.\n\n" 56 "If the snapped geometry cannot be calculated (or is totally collapsed) the feature's " 57 "geometry will be cleared.\n\n" 58 "Note that snapping to grid may generate an invalid geometry in some corner cases.\n\n" 59 "Snapping can be performed on the X, Y, Z or M axis. A grid spacing of 0 for any axis will " 60 "disable snapping for that axis." );
63 QgsSnapToGridAlgorithm *QgsSnapToGridAlgorithm::createInstance()
const 65 return new QgsSnapToGridAlgorithm();
68 void QgsSnapToGridAlgorithm::initParameters(
const QVariantMap & )
70 std::unique_ptr< QgsProcessingParameterDistance> hSpacing = qgis::make_unique< QgsProcessingParameterDistance >( QStringLiteral(
"HSPACING" ),
71 QObject::tr(
"X Grid Spacing" ), 1, QStringLiteral(
"INPUT" ),
false, 0 );
72 hSpacing->setIsDynamic(
true );
74 hSpacing->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
75 addParameter( hSpacing.release() );
77 std::unique_ptr< QgsProcessingParameterDistance> vSpacing = qgis::make_unique< QgsProcessingParameterDistance >( QStringLiteral(
"VSPACING" ),
78 QObject::tr(
"Y Grid Spacing" ), 1, QStringLiteral(
"INPUT" ),
false, 0 );
79 vSpacing->setIsDynamic(
true );
81 vSpacing->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
82 addParameter( vSpacing.release() );
84 std::unique_ptr< QgsProcessingParameterNumber > zSpacing = qgis::make_unique< QgsProcessingParameterNumber >( QStringLiteral(
"ZSPACING" ),
87 zSpacing->setIsDynamic(
true );
89 zSpacing->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
90 addParameter( zSpacing.release() );
92 std::unique_ptr< QgsProcessingParameterNumber > mSpacing = qgis::make_unique< QgsProcessingParameterNumber >( QStringLiteral(
"MSPACING" ),
95 mSpacing->setIsDynamic(
true );
97 mSpacing->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
98 addParameter( mSpacing.release() );
103 mIntervalX = parameterAsDouble( parameters, QStringLiteral(
"HSPACING" ), context );
105 if ( mDynamicIntervalX )
106 mIntervalXProperty = parameters.value( QStringLiteral(
"HSPACING" ) ).value<
QgsProperty >();
108 mIntervalY = parameterAsDouble( parameters, QStringLiteral(
"VSPACING" ), context );
110 if ( mDynamicIntervalY )
111 mIntervalYProperty = parameters.value( QStringLiteral(
"VSPACING" ) ).value<
QgsProperty >();
113 mIntervalZ = parameterAsDouble( parameters, QStringLiteral(
"ZSPACING" ), context );
115 if ( mDynamicIntervalZ )
116 mIntervalZProperty = parameters.value( QStringLiteral(
"ZSPACING" ) ).value<
QgsProperty >();
118 mIntervalM = parameterAsDouble( parameters, QStringLiteral(
"MSPACING" ), context );
120 if ( mDynamicIntervalM )
121 mIntervalMProperty = parameters.value( QStringLiteral(
"MSPACING" ) ).value<
QgsProperty >();
131 double intervalX = mIntervalX;
132 if ( mDynamicIntervalX )
133 intervalX = mIntervalXProperty.valueAsDouble( context.
expressionContext(), intervalX );
135 double intervalY = mIntervalY;
136 if ( mDynamicIntervalY )
139 double intervalZ = mIntervalZ;
140 if ( mDynamicIntervalZ )
143 double intervalM = mIntervalM;
144 if ( mDynamicIntervalM )
148 if ( outputGeometry.
isNull() )
150 feedback->
reportError( QObject::tr(
"Error snapping geometry %1" ).arg( feature.
id() ) );
Base class for providing feedback from a processing algorithm.
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
QList< QgsFeature > QgsFeatureList
A geometry is the spatial representation of a feature.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Positive double value (including 0)
QgsGeometry snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0) const
Returns a new geometry with all points or vertices snapped to the closest point of the grid...
double valueAsDouble(const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property and interprets it as a double.
A store for object properties.
QgsExpressionContext & expressionContext()
Returns the expression context.
Definition for a property.
Flag
Flags controlling how QgsProcessingFeatureSource fetches features.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Contains information about the context in which a processing algorithm is executed.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
static bool isDynamic(const QVariantMap ¶meters, const QString &name)
Returns true if the parameter with matching name is a dynamic parameter, and must be evaluated once f...