QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
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
21#include <QString>
22
23using namespace Qt::StringLiterals;
24
28
33
35{
36 return typeName();
37}
38
40{
41 if ( !input.isValid() )
43
44 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( input ) ) )
45 {
46 return true;
47 }
48
49 if ( input.userType() == QMetaType::Type::QString )
50 {
51 if ( input.toString().isEmpty() )
53
54 if ( !context )
55 return true;
56
57 QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( input.toString(), *context );
58 return mapLayer && ( mapLayer->type() == Qgis::LayerType::Raster );
59 }
60 else if ( input.userType() == QMetaType::Type::QVariantList )
61 {
62 if ( input.toList().isEmpty() )
64 ;
65
66 const QVariantList layerList = input.toList();
67 for ( const QVariant &variantLayer : layerList )
68 {
69 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( variantLayer ) ) )
70 continue;
71
72 if ( variantLayer.userType() == QMetaType::Type::QString )
73 {
74 if ( !context )
75 return true;
76
77 QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( variantLayer.toString(), *context );
78 if ( !mapLayer || mapLayer->type() != Qgis::LayerType::Raster )
79 return false;
80 }
81 else if ( variantLayer.userType() == QMetaType::Type::QVariantMap )
82 {
83 const QVariantMap layerMap = variantLayer.toMap();
84
85 if ( !layerMap.contains( u"inputFile"_s ) && !layerMap.contains( u"outputFile"_s ) )
86 return false;
87
88 if ( !context )
89 return true;
90
91 QgsRasterLayer *rasterLayer = qobject_cast< QgsRasterLayer * >( QgsProcessingUtils::mapLayerFromString( layerMap.value( u"inputFile"_s ).toString(), *context ) );
92 if ( !rasterLayer )
93 return false;
94 }
95 else
96 {
97 return false;
98 }
99 }
100 return true;
101 }
102 else if ( input.userType() == QMetaType::Type::QStringList )
103 {
104 const auto constToStringList = input.toStringList();
105 if ( constToStringList.isEmpty() )
107
108 if ( !context )
109 return true;
110
111 for ( const QString &v : constToStringList )
112 {
113 if ( !QgsProcessingUtils::mapLayerFromString( v, *context ) )
114 return false;
115 }
116 return true;
117 }
118
119 return false;
120}
121
123{
124 QStringList parts;
125 const QList<QgsAlignRasterData::RasterItem> items = parameterAsItems( value, context );
126 for ( const QgsAlignRasterData::RasterItem &item : items )
127 {
128 QStringList layerDefParts;
129 layerDefParts << u"'inputFile': "_s + QgsProcessingUtils::stringToPythonLiteral( QgsProcessingUtils::normalizeLayerSource( item.inputFilename ) );
130 layerDefParts << u"'outputFile': "_s + QgsProcessingUtils::stringToPythonLiteral( QgsProcessingUtils::normalizeLayerSource( item.outputFilename ) );
131 layerDefParts << u"'resampleMethod': "_s + QgsProcessingUtils::variantToPythonLiteral( static_cast<int>( item.resampleMethod ) );
132 layerDefParts << u"'rescale': "_s + QgsProcessingUtils::variantToPythonLiteral( item.rescaleValues );
133
134 const QString layerDef = u"{%1}"_s.arg( layerDefParts.join( ',' ) );
135 parts << layerDef;
136 }
137 return parts.join( ',' ).prepend( '[' ).append( ']' );
138}
139
141{
142 switch ( outputType )
143 {
145 {
146 QString code = u"QgsProcessingParameterAlignRasterLayers('%1', %2)"_s.arg( name(), QgsProcessingUtils::stringToPythonLiteral( description() ) );
147 return code;
148 }
149 }
150 return QString();
151}
152
153QString QgsProcessingParameterAlignRasterLayers::valueAsString( const QVariant &value, QgsProcessingContext &context, bool &ok ) const
154{
156}
157
162
163QList<QgsAlignRasterData::RasterItem> QgsProcessingParameterAlignRasterLayers::parameterAsItems( const QVariant &layersVariant, QgsProcessingContext &context )
164{
165 QList<QgsAlignRasterData::RasterItem> items;
166
167 if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( layersVariant ) ) )
168 {
169 QVariantMap vm;
170 vm["inputFile"] = layersVariant;
171 items << variantMapAsItem( vm, context );
172 }
173
174 if ( layersVariant.userType() == QMetaType::Type::QString )
175 {
176 QVariantMap vm;
177 vm["inputFile"] = layersVariant;
178 items << variantMapAsItem( vm, context );
179 }
180 else if ( layersVariant.userType() == QMetaType::Type::QVariantList )
181 {
182 const QVariantList layersVariantList = layersVariant.toList();
183 for ( const QVariant &layerItem : layersVariantList )
184 {
185 if ( layerItem.userType() == QMetaType::Type::QVariantMap )
186 {
187 const QVariantMap layerVariantMap = layerItem.toMap();
188 items << variantMapAsItem( layerVariantMap, context );
189 }
190 else if ( layerItem.userType() == QMetaType::Type::QString )
191 {
192 QVariantMap vm;
193 vm["inputFile"] = layerItem;
194 items << variantMapAsItem( vm, context );
195 }
196 }
197 }
198 else if ( layersVariant.userType() == QMetaType::Type::QStringList )
199 {
200 const auto layersStringList = layersVariant.toStringList();
201 for ( const QString &layerItem : layersStringList )
202 {
203 QVariantMap vm;
204 vm["inputFile"] = layerItem;
205 items << variantMapAsItem( vm, context );
206 }
207 }
208 else if ( layersVariant.userType() == QMetaType::Type::QVariantMap )
209 {
210 const QVariantMap layerVariantMap = layersVariant.toMap();
211 items << variantMapAsItem( layerVariantMap, context );
212 }
213
214 return items;
215}
216
218{
219 const QVariant layerVariant = layerVariantMap[u"inputFile"_s];
220
221 QgsRasterLayer *inputLayer = nullptr;
222 if ( ( inputLayer = qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( layerVariant ) ) ) )
223 {
224 // good
225 }
226 else if ( ( inputLayer = qobject_cast< QgsRasterLayer * >( QgsProcessingUtils::mapLayerFromString( layerVariant.toString(), context ) ) ) )
227 {
228 // good
229 }
230 else
231 {
232 QgsAlignRasterData::RasterItem item( "", "" );
233 return item;
234 }
235
236 QgsAlignRasterData::RasterItem item( inputLayer->source(), layerVariantMap[u"outputFile"_s].toString() );
237 item.resampleMethod = static_cast<Qgis::GdalResampleAlgorithm>( layerVariantMap.value( u"resampleMethod"_s, 0 ).toInt() );
238 item.rescaleValues = layerVariantMap.value( u"rescale"_s, false ).toBool();
239 return item;
240}
241
243{
244 QVariantMap vm;
245 vm[u"inputFile"_s] = item.inputFilename;
246 vm[u"outputFile"_s] = item.outputFilename;
247 vm[u"resampleMethod"_s] = static_cast<int>( item.resampleMethod );
248 vm[u"rescale"_s] = item.rescaleValues;
249 return vm;
250}
GdalResampleAlgorithm
Resampling algorithm to be used (equivalent to GDAL's enum GDALResampleAlg).
Definition qgis.h:6078
@ Raster
Raster layer.
Definition qgis.h:208
@ Optional
Parameter is optional.
Definition qgis.h:3882
Base class for all map layer types.
Definition qgsmaplayer.h:83
QString source() const
Returns the source for the layer.
Qgis::LayerType type
Definition qgsmaplayer.h:93
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)