QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgsrasterprojector.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrasterprojector.h - Raster projector
3  --------------------------------------
4  Date : Jan 16, 2011
5  Copyright : (C) 2005 by Radim Blazek
6  email : radim dot blazek 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 
18 /* This code takes ideas from WarpBuilder in Geotools.
19  * Thank to Ing. Andrea Aime, Ing. Simone Giannecchini and GeoSolutions S.A.S.
20  * See : http://geo-solutions.blogspot.com/2011/01/developers-corner-improving.html
21  */
22 
23 #ifndef QGSRASTERPROJECTOR_H
24 #define QGSRASTERPROJECTOR_H
25 
26 #include "qgis_core.h"
27 #include "qgis_sip.h"
28 #include <QVector>
29 #include <QList>
30 
31 #include "qgsrectangle.h"
33 #include "qgscoordinatetransform.h"
34 #include "qgsrasterinterface.h"
35 
36 #include <cmath>
37 
38 class QgsPointXY;
39 
47 class CORE_EXPORT QgsRasterProjector : public QgsRasterInterface
48 {
49  Q_GADGET
50 
51  public:
52 
57  enum Precision
58  {
59  Approximate = 0,
60  Exact = 1,
61  };
62  Q_ENUM( Precision )
63 
65 
66  QgsRasterProjector *clone() const override SIP_FACTORY;
67 
68  int bandCount() const override;
69 
70  Qgis::DataType dataType( int bandNo ) const override;
71 
76  Q_DECL_DEPRECATED void setCrs( const QgsCoordinateReferenceSystem &srcCRS, const QgsCoordinateReferenceSystem &destCRS,
77  int srcDatumTransform = -1, int destDatumTransform = -1 ) SIP_DEPRECATED;
78 
83  void setCrs( const QgsCoordinateReferenceSystem &srcCRS, const QgsCoordinateReferenceSystem &destCRS,
84  QgsCoordinateTransformContext transformContext );
85 
87  QgsCoordinateReferenceSystem sourceCrs() const { return mSrcCRS; }
88 
90  QgsCoordinateReferenceSystem destinationCrs() const { return mDestCRS; }
91 
92  Precision precision() const { return mPrecision; }
93  void setPrecision( Precision precision ) { mPrecision = precision; }
94  // Translated precision mode, for use in ComboBox etc.
95  static QString precisionLabel( Precision precision );
96 
97  QgsRasterBlock *block( int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback = nullptr ) override SIP_FACTORY;
98 
100  bool destExtentSize( const QgsRectangle &srcExtent, int srcXSize, int srcYSize,
101  QgsRectangle &destExtent SIP_OUT, int &destXSize SIP_OUT, int &destYSize SIP_OUT );
102 
104  static bool extentSize( const QgsCoordinateTransform &ct,
105  const QgsRectangle &srcExtent, int srcXSize, int srcYSize,
106  QgsRectangle &destExtent SIP_OUT, int &destXSize SIP_OUT, int &destYSize SIP_OUT );
107 
108  private:
109 
112 
115 
117  Q_DECL_DEPRECATED int mSrcDatumTransform = -1;
118 
120  Q_DECL_DEPRECATED int mDestDatumTransform = -1;
121 
123  Precision mPrecision = Approximate;
124 
125  QgsCoordinateTransformContext mTransformContext;
126 
127 };
128 
129 
130 #ifndef SIP_RUN
131 
138 class ProjectorData
139 {
140  public:
142  ProjectorData( const QgsRectangle &extent, int width, int height, QgsRasterInterface *input, const QgsCoordinateTransform &inverseCt, QgsRasterProjector::Precision precision, QgsRasterBlockFeedback *feedback = nullptr );
143  ~ProjectorData();
144 
145  ProjectorData( const ProjectorData &other ) = delete;
146  ProjectorData &operator=( const ProjectorData &other ) = delete;
147 
153  bool srcRowCol( int destRow, int destCol, int *srcRow, int *srcCol );
154 
155  QgsRectangle srcExtent() const { return mSrcExtent; }
156  int srcRows() const { return mSrcRows; }
157  int srcCols() const { return mSrcCols; }
158 
159  private:
160 
162  void destPointOnCPMatrix( int row, int col, double *theX, double *theY );
163 
165  int matrixRow( int destRow );
166 
168  int matrixCol( int destCol );
169 
171  inline bool preciseSrcRowCol( int destRow, int destCol, int *srcRow, int *srcCol );
172 
174  inline bool approximateSrcRowCol( int destRow, int destCol, int *srcRow, int *srcCol );
175 
177  void insertRows( const QgsCoordinateTransform &ct );
178 
180  void insertCols( const QgsCoordinateTransform &ct );
181 
183  void calcCP( int row, int col, const QgsCoordinateTransform &ct );
184 
186  bool calcRow( int row, const QgsCoordinateTransform &ct );
187 
189  bool calcCol( int col, const QgsCoordinateTransform &ct );
190 
192  void calcSrcExtent();
193 
195  void calcSrcRowsCols();
196 
201  bool checkCols( const QgsCoordinateTransform &ct );
202 
207  bool checkRows( const QgsCoordinateTransform &ct );
208 
210  void calcHelper( int matrixRow, QgsPointXY *points );
211 
213  void nextHelper();
214 
216  QString cpToString();
217 
222  bool mApproximate;
223 
225  QgsCoordinateTransform mInverseCt;
226 
228  QgsRectangle mDestExtent;
229 
231  QgsRectangle mSrcExtent;
232 
234  QgsRectangle mExtent;
235 
237  int mDestRows;
238 
240  int mDestCols;
241 
243  double mDestXRes;
244 
246  double mDestYRes;
247 
249  int mSrcRows;
250 
252  int mSrcCols;
253 
255  double mSrcXRes;
256 
258  double mSrcYRes;
259 
261  double mDestRowsPerMatrixRow;
262 
264  double mDestColsPerMatrixCol;
265 
267  QList< QList<QgsPointXY> > mCPMatrix;
268 
270  /* Same size as mCPMatrix */
271  QList< QList<bool> > mCPLegalMatrix;
272 
274  /* Warning: using QList is slow on access */
275  QgsPointXY *pHelperTop = nullptr;
276 
278  /* Warning: using QList is slow on access */
279  QgsPointXY *pHelperBottom = nullptr;
280 
282  int mHelperTopRow;
283 
285  int mCPCols;
287  int mCPRows;
288 
290  double mSqrTolerance;
291 
293  double mMaxSrcXRes;
294  double mMaxSrcYRes;
295 
296 };
297 
299 #endif
300 
301 #endif
302 
QgsCoordinateTransformContext
Contains information about the context in which a coordinate transform is executed.
Definition: qgscoordinatetransformcontext.h:58
qgsrectangle.h
SIP_OUT
#define SIP_OUT
Definition: qgis_sip.h:58
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:42
SIP_FACTORY
#define SIP_FACTORY
Definition: qgis_sip.h:76
QgsRasterProjector
QgsRasterProjector implements approximate projection support for it calculates grid of points in sour...
Definition: qgsrasterprojector.h:48
SIP_DEPRECATED
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
precision
int precision
Definition: qgswfsgetfeature.cpp:49
qgsrasterinterface.h
QgsRasterProjector::destinationCrs
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination CRS.
Definition: qgsrasterprojector.h:90
qgis_sip.h
QgsRasterInterface::clone
virtual QgsRasterInterface * clone() const =0
Clone itself, create deep copy.
qgscoordinatetransform.h
QgsCoordinateReferenceSystem
This class represents a coordinate reference system (CRS).
Definition: qgscoordinatereferencesystem.h:206
QgsRasterProjector::setPrecision
void setPrecision(Precision precision)
Definition: qgsrasterprojector.h:93
QgsPointXY
A class to represent a 2D point.
Definition: qgspointxy.h:44
QgsRasterProjector::precision
Precision precision() const
Definition: qgsrasterprojector.h:92
QgsRasterInterface
Base class for processing filters like renderers, reprojector, resampler etc.
Definition: qgsrasterinterface.h:117
QgsRasterBlockFeedback
Feedback object tailored for raster block reading.
Definition: qgsrasterinterface.h:41
Qgis
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:46
QgsRasterInterface::block
virtual QgsRasterBlock * block(int bandNo, const QgsRectangle &extent, int width, int height, QgsRasterBlockFeedback *feedback=nullptr)=0
Read block of data using given extent and size.
QgsCoordinateTransform
Class for doing transforms between two map coordinate systems.
Definition: qgscoordinatetransform.h:53
qgscoordinatereferencesystem.h
QgsRasterBlock
Raster data container.
Definition: qgsrasterblock.h:37
QgsRasterProjector::Precision
Precision
Precision defines if each pixel is reprojected or approximate reprojection based on an approximation ...
Definition: qgsrasterprojector.h:58