QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgsprocessingparameteralignrasterlayers.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingparameteralignrasterlayers.cpp
3 ---------------------
4 Date : July 2023
5 Copyright : (C) 2023 by Alexander Bruy
6 Email : alexander dot bruy at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgis.h"
19#include "qgsrasterlayer.h"
20
25
30
32{
33 return typeName();
34}
35
37{
38 if ( !input.isValid() )
40
41 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( input ) ) )
42 {
43 return true;
44 }
45
46 if ( input.userType() == QMetaType::Type::QString )
47 {
48 if ( input.toString().isEmpty() )
50
51 if ( !context )
52 return true;
53
54 QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( input.toString(), *context );
55 return mapLayer && ( mapLayer->type() == Qgis::LayerType::Raster );
56 }
57 else if ( input.userType() == QMetaType::Type::QVariantList )
58 {
59 if ( input.toList().isEmpty() )
61
62 const QVariantList layerList = input.toList();
63 for ( const QVariant &variantLayer : layerList )
64 {
65 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( variantLayer ) ) )
66 continue;
67
68 if ( variantLayer.userType() == QMetaType::Type::QString )
69 {
70 if ( !context )
71 return true;
72
73 QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( variantLayer.toString(), *context );
74 if ( !mapLayer || mapLayer->type() != Qgis::LayerType::Raster )
75 return false;
76 }
77 else if ( variantLayer.userType() == QMetaType::Type::QVariantMap )
78 {
79 const QVariantMap layerMap = variantLayer.toMap();
80
81 if ( !layerMap.contains( QStringLiteral( "inputFile" ) ) && !layerMap.contains( QStringLiteral( "outputFile" ) ) )
82 return false;
83
84 if ( !context )
85 return true;
86
87 QgsRasterLayer *rasterLayer = qobject_cast< QgsRasterLayer * >(
88 QgsProcessingUtils::mapLayerFromString( layerMap.value( QStringLiteral( "inputFile" ) ).toString(), *context )
89 );
90 if ( !rasterLayer )
91 return false;
92 }
93 else
94 {
95 return false;
96 }
97 }
98 return true;
99 }
100 else if ( input.userType() == QMetaType::Type::QStringList )
101 {
102 const auto constToStringList = input.toStringList();
103 if ( constToStringList.isEmpty() )
105
106 if ( !context )
107 return true;
108
109 for ( const QString &v : constToStringList )
110 {
111 if ( !QgsProcessingUtils::mapLayerFromString( v, *context ) )
112 return false;
113 }
114 return true;
115 }
116
117 return false;
118}
119
121{
122 QStringList parts;
123 const QList<QgsAlignRasterData::RasterItem> items = parameterAsItems( value, context );
124 for ( const QgsAlignRasterData::RasterItem &item : items )
125 {
126 QStringList layerDefParts;
127 layerDefParts << QStringLiteral( "'inputFile': " ) + QgsProcessingUtils::stringToPythonLiteral( QgsProcessingUtils::normalizeLayerSource( item.inputFilename ) );
128 layerDefParts << QStringLiteral( "'outputFile': " ) + QgsProcessingUtils::stringToPythonLiteral( QgsProcessingUtils::normalizeLayerSource( item.outputFilename ) );
129 layerDefParts << QStringLiteral( "'resampleMethod': " ) + QgsProcessingUtils::variantToPythonLiteral( static_cast<int>( item.resampleMethod ) );
130 layerDefParts << QStringLiteral( "'rescale': " ) + QgsProcessingUtils::variantToPythonLiteral( item.rescaleValues );
131
132 const QString layerDef = QStringLiteral( "{%1}" ).arg( layerDefParts.join( ',' ) );
133 parts << layerDef;
134 }
135 return parts.join( ',' ).prepend( '[' ).append( ']' );
136}
137
139{
140 switch ( outputType )
141 {
143 {
144 QString code = QStringLiteral( "QgsProcessingParameterAlignRasterLayers('%1', %2)" )
146 return code;
147 }
148 }
149 return QString();
150}
151
152QString QgsProcessingParameterAlignRasterLayers::valueAsString( const QVariant &value, QgsProcessingContext &context, bool &ok ) const
153{
155}
156
161
162QList<QgsAlignRasterData::RasterItem> QgsProcessingParameterAlignRasterLayers::parameterAsItems( const QVariant &layersVariant, QgsProcessingContext &context )
163{
164 QList<QgsAlignRasterData::RasterItem> items;
165
166 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( layersVariant ) ) )
167 {
168 QVariantMap vm;
169 vm["inputFile"] = layersVariant;
170 items << variantMapAsItem( vm, context );
171 }
172
173 if ( layersVariant.userType() == QMetaType::Type::QString )
174 {
175 QVariantMap vm;
176 vm["inputFile"] = layersVariant;
177 items << variantMapAsItem( vm, context );
178 }
179 else if ( layersVariant.userType() == QMetaType::Type::QVariantList )
180 {
181 const QVariantList layersVariantList = layersVariant.toList();
182 for ( const QVariant &layerItem : layersVariantList )
183 {
184 if ( layerItem.userType() == QMetaType::Type::QVariantMap )
185 {
186 const QVariantMap layerVariantMap = layerItem.toMap();
187 items << variantMapAsItem( layerVariantMap, context );
188 }
189 else if ( layerItem.userType() == QMetaType::Type::QString )
190 {
191 QVariantMap vm;
192 vm["inputFile"] = layerItem;
193 items << variantMapAsItem( vm, context );
194 }
195 }
196 }
197 else if ( layersVariant.userType() == QMetaType::Type::QStringList )
198 {
199 const auto layersStringList = layersVariant.toStringList();
200 for ( const QString &layerItem : layersStringList )
201 {
202 QVariantMap vm;
203 vm["inputFile"] = layerItem;
204 items << variantMapAsItem( vm, context );
205 }
206 }
207 else if ( layersVariant.userType() == QMetaType::Type::QVariantMap )
208 {
209 const QVariantMap layerVariantMap = layersVariant.toMap();
210 items << variantMapAsItem( layerVariantMap, context );
211 }
212
213 return items;
214}
215
217{
218 const QVariant layerVariant = layerVariantMap[ QStringLiteral( "inputFile" ) ];
219
220 QgsRasterLayer *inputLayer = nullptr;
221 if ( ( inputLayer = qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( layerVariant ) ) ) )
222 {
223 // good
224 }
225 else if ( ( inputLayer = qobject_cast< QgsRasterLayer * >( QgsProcessingUtils::mapLayerFromString( layerVariant.toString(), context ) ) ) )
226 {
227 // good
228 }
229 else
230 {
231 QgsAlignRasterData::RasterItem item( "", "" );
232 return item;
233 }
234
235 QgsAlignRasterData::RasterItem item( inputLayer->source(), layerVariantMap[ QStringLiteral( "outputFile" ) ].toString() );
236 item.resampleMethod = static_cast<Qgis::GdalResampleAlgorithm>( layerVariantMap.value( QStringLiteral( "resampleMethod" ), 0 ).toInt() );
237 item.rescaleValues = layerVariantMap.value( QStringLiteral( "rescale" ), false ).toBool();
238 return item;
239}
240
242{
243 QVariantMap vm;
244 vm[ QStringLiteral( "inputFile" )] = item.inputFilename;
245 vm[ QStringLiteral( "outputFile" ) ] = item.outputFilename;
246 vm[ QStringLiteral( "resampleMethod" ) ] = static_cast<int>( item.resampleMethod );
247 vm[ QStringLiteral( "rescale" ) ] = item.rescaleValues;
248 return vm;
249}
GdalResampleAlgorithm
Resampling algorithm to be used (equivalent to GDAL's enum GDALResampleAlg).
Definition qgis.h:5722
@ Raster
Raster layer.
Definition qgis.h:192
@ Optional
Parameter is optional.
Definition qgis.h:3765
Base class for all map layer types.
Definition qgsmaplayer.h:80
QString source() const
Returns the source for the layer.
Qgis::LayerType type
Definition qgsmaplayer.h:90
Contains information about the context in which a processing algorithm is executed.
QVariant valueAsJsonObject(const QVariant &value, QgsProcessingContext &context) const override
Returns a version of the parameter input value, which is suitable for use in a JSON object.
bool checkValueIsAcceptable(const QVariant &input, QgsProcessingContext *context=nullptr) const override
Checks whether the specified input value is acceptable for the parameter.
QString valueAsPythonString(const QVariant &value, QgsProcessingContext &context) const override
Returns a string version of the parameter input value, which is suitable for use as an input paramete...
static QString typeName()
Returns the type name for the parameter class.
static QgsAlignRasterData::RasterItem variantMapAsItem(const QVariantMap &layerVariantMap, QgsProcessingContext &context)
Converts a QVariant value (a QVariantMap) to a single input layer.
QString asPythonString(QgsProcessing::PythonOutputType outputType=QgsProcessing::PythonOutputType::PythonQgsProcessingAlgorithmSubclass) const override
Returns the parameter definition as a Python command which can be used within a Python Processing scr...
QString type() const override
Unique parameter type name.
QgsProcessingParameterAlignRasterLayers(const QString &name, const QString &description=QString())
Constructor for QgsProcessingParameterAlignRasterLayers.
static QVariantMap itemAsVariantMap(const QgsAlignRasterData::RasterItem &item)
Converts a single input layer to QVariant representation (a QVariantMap).
QgsProcessingParameterDefinition * clone() const override
Creates a clone of the parameter definition.
static QList< QgsAlignRasterData::RasterItem > parameterAsItems(const QVariant &layersVariant, QgsProcessingContext &context)
Converts a QVariant value (a QVariantList) to a list of input layers.
QString valueAsString(const QVariant &value, QgsProcessingContext &context, bool &ok) const override
Returns a string version of the parameter input value (if possible).
QString valueAsStringPrivate(const QVariant &value, QgsProcessingContext &context, bool &ok, ValueAsStringFlags flags) const
Internal method for evaluating values as string.
Qgis::ProcessingParameterFlags mFlags
Parameter flags.
QString description() const
Returns the description for the parameter.
QgsProcessingParameterDefinition(const QString &name, const QString &description=QString(), const QVariant &defaultValue=QVariant(), bool optional=false, const QString &help=QString())
Constructor for QgsProcessingParameterDefinition.
QString name() const
Returns the name of the parameter.
QVariant valueAsJsonObjectPrivate(const QVariant &value, QgsProcessingContext &context, ValueAsStringFlags flags) const
Internal method for evaluating values as JSON objects.
static QString stringToPythonLiteral(const QString &string)
Converts a string to a Python string literal.
static QString normalizeLayerSource(const QString &source)
Normalizes a layer source string for safe comparison across different operating system environments.
static QString variantToPythonLiteral(const QVariant &value)
Converts a variant to a Python literal.
static QgsMapLayer * mapLayerFromString(const QString &string, QgsProcessingContext &context, bool allowLoadingNewLayers=true, QgsProcessingUtils::LayerHint typeHint=QgsProcessingUtils::LayerHint::UnknownType, QgsProcessing::LayerOptionsFlags flags=QgsProcessing::LayerOptionsFlags())
Interprets a string as a map layer within the supplied context.
PythonOutputType
Available Python output types.
@ PythonQgsProcessingAlgorithmSubclass
Full Python QgsProcessingAlgorithm subclass.
Represents a raster layer.
Definition of one raster layer for alignment.
Qgis::GdalResampleAlgorithm resampleMethod
resampling method to be used
bool rescaleValues
rescaling of values according to the change of pixel size
QString inputFilename
filename of the source raster
QString outputFilename
filename of the newly created aligned raster (will be overwritten if exists already)