QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgsmaptopixel.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaptopixel.h - description
3  -------------------
4  begin : Sat Jun 22 2002
5  copyright : (C) 2002 by Gary E.Sherman
6  email : sherman at mrcc.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 #ifndef QGSMAPTOPIXEL
18 #define QGSMAPTOPIXEL
19 
20 #include "qgis_core.h"
21 #include "qgis_sip.h"
22 #include <QTransform>
23 #include <vector>
24 #include "qgis.h"
25 #include "qgspointxy.h"
26 
27 #include <cassert>
28 #include <memory>
29 
30 class QPoint;
31 
38 class CORE_EXPORT QgsMapToPixel
39 {
40  public:
41 
47  QgsMapToPixel();
48 
58  QgsMapToPixel( double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation );
59 
64  QgsMapToPixel( double mapUnitsPerPixel );
65 
73  static QgsMapToPixel fromScale( double scale, Qgis::DistanceUnit mapUnits, double dpi = 96 );
74 
81  bool isValid() const { return mValid; }
82 
88  QgsPointXY transform( const QgsPointXY &p ) const
89  {
90  qreal x = p.x();
91  qreal y = p.y();
92  transformInPlace( x, y );
93  return QgsPointXY( x, y );
94  }
95 
99  void transform( QgsPointXY *p ) const
100  {
101  qreal x = p->x();
102  qreal y = p->y();
103  transformInPlace( x, y );
104  p->set( x, y );
105  }
106 
114  QgsPointXY transform( qreal x, qreal y ) const
115  {
116  transformInPlace( x, y );
117  return QgsPointXY( x, y );
118  }
119 
126  void transformInPlace( double &x, double &y ) const
127  {
128  qreal mx, my;
129  mMatrix.map( static_cast< qreal >( x ), static_cast< qreal >( y ), &mx, &my );
130  x = mx;
131  y = my;
132  }
133 
142  void transformInPlace( float &x, float &y ) const SIP_SKIP
143  {
144  double mx = x, my = y;
145  transformInPlace( mx, my );
146  x = mx;
147  y = my;
148  }
149 
150 #ifndef SIP_RUN
151 
159  template <class T> SIP_SKIP
160  void transformInPlace( QVector<T> &x, QVector<T> &y ) const
161  {
162  assert( x.size() == y.size() );
163  T *xData = x.data();
164  T *yData = y.data();
165  const auto size = x.size();
166  for ( int i = 0; i < size; ++i )
167  transformInPlace( *xData++, *yData++ );
168  }
169 #endif
170 
174  QgsPointXY toMapCoordinates( int x, int y ) const
175  {
176  return toMapCoordinates( static_cast<double>( x ), static_cast<double>( y ) );
177  }
178 
182  QgsPointXY toMapCoordinates( double x, double y ) const SIP_PYNAME( toMapCoordinatesF )
183  {
184  bool invertible;
185  const QTransform matrix = mMatrix.inverted( &invertible );
186  assert( invertible );
187  qreal mx, my;
188  matrix.map( static_cast< qreal >( x ), static_cast< qreal >( y ), &mx, &my );
189  return QgsPointXY( mx, my );
190  }
191 
198  QgsPointXY toMapCoordinates( QPoint p ) const
199  {
200  const QgsPointXY mapPt = toMapCoordinates( static_cast<double>( p.x() ), static_cast<double>( p.y() ) );
201  return QgsPointXY( mapPt );
202  }
203 
209  Q_DECL_DEPRECATED QgsPointXY toMapPoint( double x, double y ) const SIP_DEPRECATED
210  {
211  return toMapCoordinates( x, y );
212  }
213 
223  void setMapUnitsPerPixel( double mapUnitsPerPixel );
224 
230  double mapUnitsPerPixel() const { return mMapUnitsPerPixel; }
231 
239  int mapWidth() const { return mWidth; }
240 
246  int mapHeight() const { return mHeight; }
247 
259  void setMapRotation( double degrees, double cx, double cy );
260 
266  double mapRotation() const { return mRotation; }
267 
282  void setParameters( double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation );
283 
299  void setParameters( double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation, bool *ok ) SIP_SKIP;
300 
304  QString showParameters() const;
305 
309  QTransform transform() const;
310 
315  double xCenter() const { return mXCenter; }
316 
321  double yCenter() const { return mYCenter; }
322 
323  bool operator==( const QgsMapToPixel &other ) const
324  {
325  return mValid == other.mValid
326  && mMapUnitsPerPixel == other.mMapUnitsPerPixel
327  && mWidth == other.mWidth
328  && mHeight == other.mHeight
329  && mRotation == other.mRotation
330  && mXCenter == other.mXCenter
331  && mYCenter == other.mYCenter
332  && mXMin == other.mXMin
333  && mYMin == other.mYMin;
334  }
335 
336  bool operator!=( const QgsMapToPixel &other ) const
337  {
338  return !( *this == other );
339  }
340 
341  private:
342  bool mValid = false;
343  double mMapUnitsPerPixel = 1;
344  int mWidth = 1;
345  int mHeight = 1;
346  double mRotation = 0.0;
347  double mXCenter = 0.5;
348  double mYCenter = 0.5;
349  double mXMin = 0;
350  double mYMin = 0;
351  QTransform mMatrix;
352 
353  bool updateMatrix();
354 };
355 
356 
357 #endif // QGSMAPTOPIXEL
DistanceUnit
Units of distance.
Definition: qgis.h:4090
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:39
bool isValid() const
Returns true if the object is valid (i.e.
Definition: qgsmaptopixel.h:81
int mapHeight() const
Returns current map height in pixels.
double xCenter() const
Returns the center x-coordinate for the transform.
double yCenter() const
Returns the center y-coordinate for the transform.
QgsPointXY transform(qreal x, qreal y) const
Transforms the point specified by x,y from map (world) coordinates to device coordinates.
QgsPointXY toMapCoordinates(double x, double y) const
Transforms device coordinates to map (world) coordinates.
double mapUnitsPerPixel() const
Returns the current map units per pixel.
bool operator==(const QgsMapToPixel &other) const
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
int mapWidth() const
Returns the current map width in pixels.
QgsPointXY transform(const QgsPointXY &p) const
Transforms a point p from map (world) coordinates to device coordinates.
Definition: qgsmaptopixel.h:88
void transform(QgsPointXY *p) const
Transforms a point p from map (world) coordinates to device coordinates in place.
Definition: qgsmaptopixel.h:99
void transformInPlace(QVector< T > &x, QVector< T > &y) const
Transforms device coordinates to map coordinates.
double mapRotation() const
Returns the current map rotation in degrees (clockwise).
bool operator!=(const QgsMapToPixel &other) const
void transformInPlace(double &x, double &y) const
Transforms device coordinates to map coordinates.
void transformInPlace(float &x, float &y) const
Transforms device coordinates to map coordinates.
QgsPointXY toMapCoordinates(QPoint p) const
Transforms device coordinates to map (world) coordinates.
Q_DECL_DEPRECATED QgsPointXY toMapPoint(double x, double y) const
Transforms device coordinates to map (world) coordinates.
A class to represent a 2D point.
Definition: qgspointxy.h:60
void set(double x, double y)
Sets the x and y value of the point.
Definition: qgspointxy.h:137
double y
Definition: qgspointxy.h:64
Q_GADGET double x
Definition: qgspointxy.h:63
#define SIP_DEPRECATED
Definition: qgis_sip.h:106
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_PYNAME(name)
Definition: qgis_sip.h:81