QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsalgorithmalignrasters.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmalignrasters.cpp
3 ---------------------
4 begin : July 2023
5 copyright : (C) 2023 by Alexander Bruy
6 email : alexander dot bruy at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
20#include "qgsalignraster.h"
21#include "qgsalignrasterdata.h"
22
24
25Qgis::ProcessingAlgorithmFlags QgsAlignRastersAlgorithm::flags() const
26{
28}
29
30QString QgsAlignRastersAlgorithm::name() const
31{
32 return QStringLiteral( "alignrasters" );
33}
34
35QString QgsAlignRastersAlgorithm::displayName() const
36{
37 return QObject::tr( "Align rasters" );
38}
39
40QStringList QgsAlignRastersAlgorithm::tags() const
41{
42 return QObject::tr( "raster,align,resample,rescale" ).split( ',' );
43}
44
45QString QgsAlignRastersAlgorithm::group() const
46{
47 return QObject::tr( "Raster tools" );
48}
49
50QString QgsAlignRastersAlgorithm::groupId() const
51{
52 return QStringLiteral( "rastertools" );
53}
54
55QString QgsAlignRastersAlgorithm::shortHelpString() const
56{
57 return QObject::tr( "Aligns rasters by resampling them to the same cell size and reprojecting to the same CRS." );
58}
59
60QgsAlignRastersAlgorithm *QgsAlignRastersAlgorithm::createInstance() const
61{
62 return new QgsAlignRastersAlgorithm();
63}
64
65void QgsAlignRastersAlgorithm::initAlgorithm( const QVariantMap & )
66{
67 addParameter( new QgsProcessingParameterAlignRasterLayers( QStringLiteral( "LAYERS" ), QObject::tr( "Input layers" ) ) );
68 addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "REFERENCE_LAYER" ), QObject::tr( "Reference layer" ) ) );
69
70 addParameter( new QgsProcessingParameterCrs( QStringLiteral( "CRS" ), QObject::tr( "Override reference CRS" ), QVariant(), true ) );
71 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "CELL_SIZE_X" ), QObject::tr( "Override reference cell size X" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true, 1e-9 ) );
72 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "CELL_SIZE_Y" ), QObject::tr( "Override reference cell size Y" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true, 1e-9 ) );
73 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "GRID_OFFSET_X" ), QObject::tr( "Override reference grid offset X" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true, 1e-9 ) );
74 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "GRID_OFFSET_Y" ), QObject::tr( "Override reference grid offset Y" ), Qgis::ProcessingNumberParameterType::Double, QVariant(), true, 1e-9 ) );
75 addParameter( new QgsProcessingParameterExtent( QStringLiteral( "EXTENT" ), QObject::tr( "Clip to extent" ), QVariant(), true ) );
76
77 addOutput( new QgsProcessingOutputMultipleLayers( QStringLiteral( "OUTPUT_LAYERS" ), QObject::tr( "Aligned rasters" ) ) );
78}
79
80struct QgsAlignRasterProgress : public QgsAlignRaster::ProgressHandler
81{
82 explicit QgsAlignRasterProgress( QgsFeedback *feedback ) : mFeedback( feedback ) {}
83 bool progress( double complete ) override
84 {
85 mFeedback->setProgress( complete * 100 );
86 return true;
87 }
88
89 protected:
90 QgsFeedback *mFeedback = nullptr;
91};
92
93
94QVariantMap QgsAlignRastersAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
95{
96 QgsRasterLayer *referenceLayer = parameterAsRasterLayer( parameters, QStringLiteral( "REFERENCE_LAYER" ), context );
97 if ( !referenceLayer )
98 throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "REFERENCE_LAYER" ) ) );
99
100 const QVariant layersVariant = parameters.value( parameterDefinition( QStringLiteral( "LAYERS" ) )->name() );
101 const QList<QgsAlignRasterData::RasterItem> items = QgsProcessingParameterAlignRasterLayers::parameterAsItems( layersVariant, context );
102 QStringList outputLayers;
103 outputLayers.reserve( items.size() );
104 for ( const QgsAlignRasterData::RasterItem &item : items )
105 {
106 outputLayers << item.outputFilename;
107 }
108
109 QgsAlignRaster rasterAlign;
110 rasterAlign.setRasters( items );
111
112 QString customCRSWkt;
113 QSizeF customCellSize;
114 QPointF customGridOffset( -1, -1 );
115
116 if ( parameters.value( QStringLiteral( "CRS" ) ).isValid() )
117 {
118 QgsCoordinateReferenceSystem crs = parameterAsCrs( parameters, QStringLiteral( "CRS" ), context );
120 }
121
122 bool hasXValue = parameters.value( QStringLiteral( "CELL_SIZE_X" ) ).isValid();
123 bool hasYValue = parameters.value( QStringLiteral( "CELL_SIZE_Y" ) ).isValid();
124 if ( ( hasXValue && !hasYValue ) || ( !hasXValue && hasYValue ) )
125 {
126 throw QgsProcessingException( QObject::tr( "Either set both X and Y cell size values or keep both as 'Not set'." ) );
127 }
128 else if ( hasXValue && hasYValue )
129 {
130 double xSize = parameterAsDouble( parameters, QStringLiteral( "CELL_SIZE_X" ), context );
131 double ySize = parameterAsDouble( parameters, QStringLiteral( "CELL_SIZE_Y" ), context );
132 customCellSize = QSizeF( xSize, ySize );
133 }
134
135 hasXValue = parameters.value( QStringLiteral( "GRID_OFFSET_X" ) ).isValid();
136 hasYValue = parameters.value( QStringLiteral( "GRID_OFFSET_Y" ) ).isValid();
137 if ( ( hasXValue && !hasYValue ) || ( !hasXValue && hasYValue ) )
138 {
139 throw QgsProcessingException( QObject::tr( "Either set both X and Y grid offset values or keep both as 'Not set'." ) );
140 }
141 else if ( hasXValue && hasYValue )
142 {
143 double xSize = parameterAsDouble( parameters, QStringLiteral( "GRID_OFFSET_X" ), context );
144 double ySize = parameterAsDouble( parameters, QStringLiteral( "GRID_OFFSET_Y" ), context );
145 customGridOffset = QPointF( xSize, ySize );
146 }
147
148 if ( parameters.value( QStringLiteral( "EXTENT" ) ).isValid() )
149 {
150 QgsRectangle extent = parameterAsExtent( parameters, QStringLiteral( "EXTENT" ), context );
151 rasterAlign.setClipExtent( extent );
152 }
153
154 rasterAlign.setProgressHandler( new QgsAlignRasterProgress( feedback ) );
155
156 bool result = rasterAlign.setParametersFromRaster( referenceLayer->source(), customCRSWkt, customCellSize, customGridOffset );
157 if ( !result )
158 {
159 throw QgsProcessingException( QObject::tr( "It is not possible to reproject reference raster to target CRS." ) );
160 }
161
162 result = rasterAlign.run();
163 if ( !result )
164 {
165 throw QgsProcessingException( QObject::tr( "Failed to align rasters: %1" ).arg( rasterAlign.errorMessage() ) );
166 }
167
168 QVariantMap outputs;
169 outputs.insert( QStringLiteral( "OUTPUT_LAYERS" ), outputLayers );
170 return outputs;
171}
172
QFlags< ProcessingAlgorithmFlag > ProcessingAlgorithmFlags
Flags indicating how and when an algorithm operates and should be exposed to users.
Definition: qgis.h:2934
@ PreferredGdal
Preferred format for conversion of CRS to WKT for use with the GDAL library.
@ HideFromModeler
Algorithm should be hidden from the modeler.
QgsAlignRaster takes one or more raster layers and warps (resamples) them so they have the same:
bool setParametersFromRaster(const RasterInfo &rasterInfo, const QString &customCRSWkt=QString(), QSizeF customCellSize=QSizeF(), QPointF customGridOffset=QPointF(-1, -1))
Set destination CRS, cell size and grid offset from a raster file.
bool run()
Run the alignment process.
void setClipExtent(double xmin, double ymin, double xmax, double ymax)
Configure clipping extent (region of interest).
void setProgressHandler(ProgressHandler *progressHandler)
Assign a progress handler instance. Does not take ownership. nullptr can be passed.
QString errorMessage() const
Returns the error from a previous run() call.
void setRasters(const List &list)
Sets list of rasters that will be aligned.
This class represents a coordinate reference system (CRS).
QString toWkt(Qgis::CrsWktVariant variant=Qgis::CrsWktVariant::Wkt1Gdal, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:44
QString source() const
Returns the source for the layer.
virtual Qgis::ProcessingAlgorithmFlags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Definition: qgsexception.h:83
Base class for providing feedback from a processing algorithm.
A multi-layer output for processing algorithms which create map layers, when the number and nature of...
A parameter for Processing algorithms that need a list of input raster layers to align - this paramet...
static QList< QgsAlignRasterData::RasterItem > parameterAsItems(const QVariant &layersVariant, QgsProcessingContext &context)
Converts a QVariant value (a QVariantList) to a list of input layers.
A coordinate reference system parameter for processing algorithms.
A rectangular map extent parameter for processing algorithms.
A numeric parameter for processing algorithms.
A raster layer parameter for processing algorithms.
Represents a raster layer.
A rectangle specified with double values.
Definition: qgsrectangle.h:42
const QgsCoordinateReferenceSystem & crs
Definition of one raster layer for alignment.
Helper struct to be sub-classed for progress reporting.
virtual bool progress(double complete)=0
Method to be overridden for progress reporting.