QGIS API Documentation 3.34.0-Prizren (ffbdd678812)
Loading...
Searching...
No Matches
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
25QgsProcessingAlgorithm::Flags QgsAlignRastersAlgorithm::flags() const
26{
27 return QgsProcessingAlgorithm::flags() | FlagHideFromModeler;
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" ), QgsProcessingParameterNumber::Double, QVariant(), true, 1e-9 ) );
72 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "CELL_SIZE_Y" ), QObject::tr( "Override reference cell size Y" ), QgsProcessingParameterNumber::Double, QVariant(), true, 1e-9 ) );
73 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "GRID_OFFSET_X" ), QObject::tr( "Override reference grid offset X" ), QgsProcessingParameterNumber::Double, QVariant(), true, 1e-9 ) );
74 addParameter( new QgsProcessingParameterNumber( QStringLiteral( "GRID_OFFSET_Y" ), QObject::tr( "Override reference grid offset Y" ), QgsProcessingParameterNumber::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
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).
@ WKT_PREFERRED_GDAL
Preferred format for conversion of CRS to WKT for use with the GDAL library.
QString toWkt(WktVariant variant=WKT1_GDAL, 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:45
QString source() const
Returns the source for the layer.
virtual Flags 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.
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.
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.