QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgsquickmapsettings.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsquickmapsettings.cpp
3  --------------------------------------
4  Date : 27.12.2014
5  Copyright : (C) 2014 by Matthias Kuhn
6  Email : matthias (at) opengis.ch
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 
16 
17 #include "qgsmaplayer.h"
19 #include "qgsmessagelog.h"
20 #include "qgsproject.h"
21 #include "qgis.h"
22 
23 #include "qgsquickmapsettings.h"
24 
26  : QObject( parent )
27 {
28  // Connect signals for derived values
35 }
36 
38 {
39  if ( project == mProject )
40  return;
41 
42  // If we have already something connected, disconnect it!
43  if ( mProject )
44  {
45  mProject->disconnect( this );
46  }
47 
48  mProject = project;
49 
50  // Connect all signals
51  if ( mProject )
52  {
53  connect( mProject, &QgsProject::readProject, this, &QgsQuickMapSettings::onReadProject );
54  setDestinationCrs( mProject->crs() );
55  mMapSettings.setTransformContext( mProject->transformContext() );
56  }
57  else
58  {
60  }
61 
62  emit projectChanged();
63 }
64 
66 {
67  return mProject;
68 }
69 
71 {
72  return mMapSettings.transformContext();
73 }
74 
76 {
77  return mMapSettings.extent();
78 }
79 
81 {
82  if ( mMapSettings.extent() == extent )
83  return;
84 
85  mMapSettings.setExtent( extent );
86  emit extentChanged();
87 }
88 
90 {
91  QgsVector delta = QgsPointXY( center ) - mMapSettings.extent().center();
92 
93  QgsRectangle e = mMapSettings.extent();
94  e.setXMinimum( e.xMinimum() + delta.x() );
95  e.setXMaximum( e.xMaximum() + delta.x() );
96  e.setYMinimum( e.yMinimum() + delta.y() );
97  e.setYMaximum( e.yMaximum() + delta.y() );
98 
99  setExtent( e );
100 }
101 
103 {
104  return mMapSettings.mapUnitsPerPixel();
105 }
106 
108 {
109  return mMapSettings.visibleExtent();
110 }
111 
113 {
114  QgsPointXY pt( point.x(), point.y() );
115  QgsPointXY pp = mMapSettings.mapToPixel().transform( pt );
116  return pp.toQPointF();
117 }
118 
120 {
121  // use floating point precision with mapToCoordinates (i.e. do not use QPointF::toPoint)
122  // this is to avoid rounding errors with an odd screen width or height
123  // and the point being set to the exact center of it
124  const QgsPointXY pp = mMapSettings.mapToPixel().toMapCoordinates( point.x(), point.y() );
125  return QgsPoint( pp );
126 }
127 
129 {
130  return mMapSettings;
131 }
132 
134 {
135  return mMapSettings.outputSize();
136 }
137 
139 {
140  if ( mMapSettings.outputSize() == outputSize )
141  return;
142 
143  mMapSettings.setOutputSize( outputSize );
144  emit outputSizeChanged();
145 }
146 
147 double QgsQuickMapSettings::outputDpi() const
148 {
149  return mMapSettings.outputDpi();
150 }
151 
153 {
154  if ( qgsDoubleNear( mMapSettings.outputDpi(), outputDpi ) )
155  return;
156 
157  mMapSettings.setOutputDpi( outputDpi );
158  emit outputDpiChanged();
159 }
160 
162 {
163  return mMapSettings.destinationCrs();
164 }
165 
167 {
168  if ( mMapSettings.destinationCrs() == destinationCrs )
169  return;
170 
171  mMapSettings.setDestinationCrs( destinationCrs );
172  emit destinationCrsChanged();
173 }
174 
175 QList<QgsMapLayer *> QgsQuickMapSettings::layers() const
176 {
177  return mMapSettings.layers();
178 }
179 
180 void QgsQuickMapSettings::setLayers( const QList<QgsMapLayer *> &layers )
181 {
182  mMapSettings.setLayers( layers );
183  emit layersChanged();
184 }
185 
186 void QgsQuickMapSettings::onReadProject( const QDomDocument &doc )
187 {
188  QDomNodeList nodes = doc.elementsByTagName( "mapcanvas" );
189  if ( nodes.count() )
190  {
191  QDomNode node = nodes.item( 0 );
192 
193  mMapSettings.readXml( node );
194 
195  if ( !qgsDoubleNear( mMapSettings.rotation(), 0 ) )
196  QgsMessageLog::logMessage( tr( "Map Canvas rotation is not supported. Resetting from %1 to 0." ).arg( mMapSettings.rotation() ) );
197 
198  mMapSettings.setRotation( 0 );
199 
200  emit extentChanged();
201  emit destinationCrsChanged();
202  emit outputSizeChanged();
203  emit outputDpiChanged();
204  emit layersChanged();
205  }
206 }
207 
208 double QgsQuickMapSettings::rotation() const
209 {
210  return mMapSettings.rotation();
211 }
212 
214 {
215  if ( !qgsDoubleNear( rotation, 0 ) )
216  QgsMessageLog::logMessage( tr( "Map Canvas rotation is not supported. Resetting from %1 to 0." ).arg( rotation ) );
217 }
double outputDpi() const
Returns DPI used for conversion between real world units (e.g.
QSize outputSize() const
Returns the size of the resulting map image.
void visibleExtentChanged()
Returns the actual extent derived from requested extent that takes takes output image size into accou...
void setDestinationCrs(const QgsCoordinateReferenceSystem &crs)
sets destination coordinate reference system
A rectangle specified with double values.
Definition: qgsrectangle.h:41
void setExtent(const QgsRectangle &rect, bool magnified=true)
Set coordinates of the rectangle which should be rendered.
double y
Definition: qgspoint.h:42
void setTransformContext(const QgsCoordinateTransformContext &context)
Sets the coordinate transform context, which stores various information regarding which datum transfo...
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
void setXMaximum(double x)
Set the maximum x value.
Definition: qgsrectangle.h:135
QList< QgsMapLayer * > layers() const
Gets list of layers for map rendering The layers are stored in the reverse order of how they are rend...
void rotationChanged()
The rotation of the resulting map image, in degrees clockwise.
void extentChanged()
Geographical coordinates of the rectangle that should be rendered.
A class to represent a 2D point.
Definition: qgspointxy.h:43
QgsMapSettings mapSettings() const
Clone map settings.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:265
void setOutputDpi(double dpi)
Sets DPI used for conversion between real world units (e.g. mm) and pixels.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
QList< QgsMapLayer * > layers() const
Gets list of layers for map rendering The layers are stored in the reverse order of how they are rend...
void setLayers(const QList< QgsMapLayer *> &layers)
Set list of layers for map rendering.
void setOutputSize(const QSize &outputSize)
Sets the size of the resulting map image.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
The QgsMapSettings class contains configuration for rendering of the map.
void outputDpiChanged()
Output DPI used for conversion between real world units (e.g.
Q_INVOKABLE QPointF coordinateToScreen(const QgsPoint &point) const
Convert a map coordinate to screen pixel coordinates.
void mapUnitsPerPixelChanged()
Returns the distance in geographical coordinates that equals to one pixel in the map.
QgsPointXY transform(const QgsPointXY &p) const
Transform the point from map (world) coordinates to device coordinates.
double rotation() const
The rotation of the resulting map image, in degrees clockwise.
Q_INVOKABLE QgsPoint screenToCoordinate(const QPointF &point) const
Convert a screen coordinate to a map coordinate.
QgsRectangle extent() const
Returns geographical coordinates of the rectangle that should be rendered.
QPointF toQPointF() const
Converts a point to a QPointF.
Definition: qgspointxy.h:148
void setOutputSize(QSize size)
Sets the size of the resulting map image.
void projectChanged()
A project property should be used as a primary source of project all other components in the applicat...
void setYMinimum(double y)
Set the minimum y value.
Definition: qgsrectangle.h:140
void setOutputDpi(double outputDpi)
Sets DPI used for conversion between real world units (e.g. mm) and pixels.
QgsCoordinateReferenceSystem crs
Definition: qgsproject.h:95
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
void readProject(const QDomDocument &)
Emitted when a project is being read.
void setRotation(double rotation)
The rotation of the resulting map image, in degrees clockwise.
Reads and writes project states.
Definition: qgsproject.h:89
void setDestinationCrs(const QgsCoordinateReferenceSystem &destinationCrs)
sets destination coordinate reference system
Contains information about the context in which a coordinate transform is executed.
void destinationCrsChanged()
CRS of destination coordinate reference system.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
const QgsMapToPixel & mapToPixel() const
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
A class to represent a vector.
Definition: qgsvector.h:29
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:177
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
Q_INVOKABLE void setCenter(const QgsPoint &center)
Move current map extent to have center point defined by center.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:162
QgsCoordinateTransformContext transformContext
Definition: qgsproject.h:96
void setProject(QgsProject *project)
A project property should be used as a primary source of project all other components in the applicat...
double outputDpi() const
Returns DPI used for conversion between real world units (e.g.
void setYMaximum(double y)
Set the maximum y value.
Definition: qgsrectangle.h:145
void setExtent(const QgsRectangle &extent)
Set coordinates of the rectangle which should be rendered.
void outputSizeChanged()
The size of the resulting map image.
This class represents a coordinate reference system (CRS).
double xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:167
void setLayers(const QList< QgsMapLayer *> &layers)
Set list of layers for map rendering.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:172
QgsProject * project() const
A project property should be used as a primary source of project all other components in the applicat...
double x() const
Returns the vector&#39;s x-component.
Definition: qgsvector.cpp:76
QgsPointXY center() const
Returns the center point of the rectangle.
Definition: qgsrectangle.h:230
void readXml(QDomNode &node)
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
double y() const
Returns the vector&#39;s y-component.
Definition: qgsvector.cpp:81
Q_INVOKABLE QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
QSize outputSize() const
Returns the size of the resulting map image.
QgsQuickMapSettings(QObject *parent=nullptr)
Create new map settings.
QgsPointXY toMapCoordinates(int x, int y) const
Transform device coordinates to map (world) coordinates.
void setXMinimum(double x)
Set the minimum x value.
Definition: qgsrectangle.h:130
void layersChanged()
Set list of layers for map rendering.
double x
Definition: qgspoint.h:41