24using namespace Qt::StringLiterals;
29QString QgsDrapeAlgorithmBase::group()
const
31 return QObject::tr(
"Vector geometry" );
34QString QgsDrapeAlgorithmBase::groupId()
const
36 return u
"vectorgeometry"_s;
39QString QgsDrapeAlgorithmBase::outputName()
const
41 return QObject::tr(
"Draped" );
44void QgsDrapeAlgorithmBase::initParameters(
const QVariantMap & )
51 nodata->setIsDynamic(
true );
53 nodata->setDynamicLayerParameterName( u
"INPUT"_s );
54 addParameter( nodata.release() );
57 scaleParam->setIsDynamic(
true );
59 scaleParam->setDynamicLayerParameterName( u
"INPUT"_s );
60 addParameter( scaleParam.release() );
63 offsetParam->setIsDynamic(
true );
65 offsetParam->setDynamicLayerParameterName( u
"INPUT"_s );
66 addParameter( offsetParam.release() );
71 mNoData = parameterAsDouble( parameters, u
"NODATA"_s, context );
74 mNoDataProperty = parameters.value( u
"NODATA"_s ).value<
QgsProperty>();
76 mScale = parameterAsDouble( parameters, u
"SCALE"_s, context );
79 mScaleProperty = parameters.value( u
"SCALE"_s ).value<
QgsProperty>();
81 mOffset = parameterAsDouble( parameters, u
"OFFSET"_s, context );
84 mOffsetProperty = parameters.value( u
"OFFSET"_s ).value<
QgsProperty>();
86 QgsRasterLayer *layer = parameterAsRasterLayer( parameters, u
"RASTER"_s, context );
91 mBand = parameterAsInt( parameters, u
"BAND"_s, context );
92 if ( mBand < 1 || mBand > layer->bandCount() )
93 throw QgsProcessingException( QObject::tr(
"Invalid band number for BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand ).arg( layer->bandCount() ) );
94 mRasterExtent = layer->extent();
96 mRasterProvider.reset( layer->dataProvider()->clone() );
97 if ( !mRasterProvider )
105 if ( !mCreatedTransform )
107 mCreatedTransform =
true;
127 double nodata = mNoData;
128 if ( mDynamicNoData )
131 double scale = mScale;
135 double offset = mOffset;
136 if ( mDynamicOffset )
139 prepareGeometry( geometry, nodata );
150 t = mTransform.transform( p );
152 val = mRasterProvider->sample( t, mBand, &ok );
163 feedback->
reportError( QObject::tr(
"Transform error while reprojecting feature {}" ).arg( f.
id() ) );
166 return drapeVertex( p, val );
180QString QgsDrapeToZAlgorithm::name()
const
182 return u
"setzfromraster"_s;
185QString QgsDrapeToZAlgorithm::displayName()
const
187 return QObject::tr(
"Drape (set Z value from raster)" );
190QStringList QgsDrapeToZAlgorithm::tags()
const
192 return QObject::tr(
"3d,vertex,vertices,elevation,height,sample,dem,update,feature" ).split(
',' );
195QString QgsDrapeToZAlgorithm::shortHelpString()
const
197 return QObject::tr(
"This algorithm sets the z value of every vertex in the feature geometry to a value sampled from a band within a raster layer." )
199 + QObject::tr(
"The raster values can optionally be scaled by a preset amount and an offset can be algebraically added." );
202QString QgsDrapeToZAlgorithm::shortDescription()
const
204 return QObject::tr(
"Sets the z value for vertices to values sampled from a raster layer." );
207QgsDrapeToZAlgorithm *QgsDrapeToZAlgorithm::createInstance()
const
209 return new QgsDrapeToZAlgorithm();
212bool QgsDrapeToZAlgorithm::supportInPlaceEdit(
const QgsMapLayer *l )
const
214 const QgsVectorLayer *layer = qobject_cast<const QgsVectorLayer *>( l );
218 if ( !QgsDrapeAlgorithmBase::supportInPlaceEdit( layer ) )
229void QgsDrapeToZAlgorithm::prepareGeometry(
QgsGeometry &geometry,
double defaultVal )
const
234QgsPoint QgsDrapeToZAlgorithm::drapeVertex(
const QgsPoint &p,
double rasterVal )
const
243QString QgsDrapeToMAlgorithm::name()
const
245 return u
"setmfromraster"_s;
248QString QgsDrapeToMAlgorithm::displayName()
const
250 return QObject::tr(
"Set M value from raster" );
253QStringList QgsDrapeToMAlgorithm::tags()
const
255 return QObject::tr(
"drape,vertex,vertices,sample,dem,update,feature,measure" ).split(
',' );
258QString QgsDrapeToMAlgorithm::shortHelpString()
const
260 return QObject::tr(
"This algorithm sets the M value for every vertex in the feature geometry to a value sampled from a band within a raster layer." )
262 + QObject::tr(
"The raster values can optionally be scaled by a preset amount and an offset can be algebraically added." );
265QString QgsDrapeToMAlgorithm::shortDescription()
const
267 return QObject::tr(
"Sets the M value for vertices to values sampled from a raster layer." );
270QgsDrapeToMAlgorithm *QgsDrapeToMAlgorithm::createInstance()
const
272 return new QgsDrapeToMAlgorithm();
275bool QgsDrapeToMAlgorithm::supportInPlaceEdit(
const QgsMapLayer *l )
const
277 const QgsVectorLayer *layer = qobject_cast<const QgsVectorLayer *>( l );
281 if ( !QgsDrapeAlgorithmBase::supportInPlaceEdit( layer ) )
292void QgsDrapeToMAlgorithm::prepareGeometry(
QgsGeometry &geometry,
double defaultVal )
const
297QgsPoint QgsDrapeToMAlgorithm::drapeVertex(
const QgsPoint &p,
double rasterVal )
const
WkbType
The WKB type describes the number of dimensions a geometry has.
@ Reverse
Reverse/inverse transform (from destination to source).
@ Double
Double/float values.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
Custom exception class for Coordinate Reference System related exceptions.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
A geometry is the spatial representation of a feature.
bool boundingBoxIntersects(const QgsRectangle &rectangle) const
Returns true if the bounding box of this geometry intersects with a rectangle.
void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
Base class for all map layer types.
Point geometry type, with support for z-dimension and m-values.
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
A raster band parameter for Processing algorithms.
A raster layer parameter for processing algorithms.
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...
Definition for a property.
@ Double
Double value (including negative values).
A store for object properties.
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.
Represents a raster layer.
A rectangle specified with double values.
Represents a vector layer which manages a vector based dataset.
Q_INVOKABLE Qgis::WkbType wkbType() const final
Returns the WKBType or WKBUnknown in case of error.
static Qgis::WkbType addM(Qgis::WkbType type)
Adds the m dimension to a WKB type and returns the new type.
static Qgis::WkbType addZ(Qgis::WkbType type)
Adds the z dimension to a WKB type and returns the new type.
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
QList< QgsFeature > QgsFeatureList