QGIS API Documentation  2.7.0-Master
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
qgsmaprenderer.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaprender.h - class for rendering map layer set
3  ----------------------
4  begin : January 2006
5  copyright : (C) 2006 by Martin Dobias
6  email : wonder.sk at gmail dot com
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 #ifndef QGSMAPRENDER_H
17 #define QGSMAPRENDER_H
18 
19 #include <QMutex>
20 #include <QSize>
21 #include <QStringList>
22 #include <QVector>
23 #include <QPainter>
24 
25 #include "qgis.h"
26 #include "qgsrectangle.h"
27 #include "qgsrendercontext.h"
28 #include "qgsfeature.h"
29 #include "qgsmapsettings.h"
30 
31 class QDomDocument;
32 class QDomNode;
33 class QPainter;
34 
35 class QgsMapToPixel;
36 class QgsMapLayer;
37 class QgsMapRenderer;
38 class QgsScaleCalculator;
40 class QgsDistanceArea;
41 class QgsVectorLayer;
42 
45 
46 class CORE_EXPORT QgsLabelPosition
47 {
48  public:
49  QgsLabelPosition( int id, double r, const QVector< QgsPoint >& corners, const QgsRectangle& rect, double w, double h, const QString& layer, const QString& labeltext, const QFont& labelfont, bool upside_down, bool diagram = false, bool pinned = false ):
50  featureId( id ), rotation( r ), cornerPoints( corners ), labelRect( rect ), width( w ), height( h ), layerID( layer ), labelText( labeltext ), labelFont( labelfont ), upsideDown( upside_down ), isDiagram( diagram ), isPinned( pinned ) {}
51  QgsLabelPosition(): featureId( -1 ), rotation( 0 ), labelRect( QgsRectangle() ), width( 0 ), height( 0 ), layerID( "" ), labelText( "" ), labelFont( QFont() ), upsideDown( false ), isDiagram( false ), isPinned( false ) {}
52  int featureId;
53  double rotation;
54  QVector< QgsPoint > cornerPoints;
56  double width;
57  double height;
58  QString layerID;
59  QString labelText;
60  QFont labelFont;
61  bool upsideDown;
62  bool isDiagram;
63  bool isPinned;
64 };
65 
67 class CORE_EXPORT QgsLabelingEngineInterface
68 {
69  public:
70 
72 
75  Q_DECL_DEPRECATED virtual void init( QgsMapRenderer* mp ) = 0;
77  virtual void init( const QgsMapSettings& mapSettings ) = 0;
79  virtual bool willUseLayer( QgsVectorLayer* layer ) = 0;
81  virtual void clearActiveLayers() = 0;
83  virtual void clearActiveLayer( const QString& layerID ) = 0;
85  virtual int prepareLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx ) = 0;
87  virtual QgsPalLayerSettings& layer( const QString& layerName ) = 0;
89  virtual int addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLayerSettings* s )
90  { Q_UNUSED( layer ); Q_UNUSED( s ); return 0; }
92  virtual void registerFeature( const QString& layerID, QgsFeature& feat, const QgsRenderContext& context = QgsRenderContext(), QString dxfLayer = QString::null ) = 0;
94  virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, const QgsRenderContext& context = QgsRenderContext() )
95  { Q_UNUSED( layerID ); Q_UNUSED( feat ); Q_UNUSED( context ); }
97  virtual void drawLabeling( QgsRenderContext& context ) = 0;
99  virtual void exit() = 0;
102  Q_DECL_DEPRECATED virtual QList<QgsLabelPosition> labelsAtPosition( const QgsPoint& p ) = 0;
105  Q_DECL_DEPRECATED virtual QList<QgsLabelPosition> labelsWithinRect( const QgsRectangle& r ) = 0;
106 
108  virtual QgsLabelingEngineInterface* clone() = 0;
109 };
110 
111 struct CORE_EXPORT QgsLayerCoordinateTransform
112 {
113  QString srcAuthId;
114  QString destAuthId;
115  int srcDatumTransform; //-1 if unknown or not specified
117 };
118 
119 // ### QGIS 3: remove QgsMapRenderer in favor of QgsMapRendererJob
120 
125 class CORE_EXPORT QgsMapRenderer : public QObject
126 {
127  Q_OBJECT
128 
129  public:
130 
133  {
135  Pixels
136  //MAP_UNITS probably supported in future versions
137  };
138 
143  {
168  };
169 
171  QgsMapRenderer();
172 
174  ~QgsMapRenderer();
175 
179  void render( QPainter* painter, double* forceWidthScale = 0 );
180 
182  bool setExtent( const QgsRectangle& extent );
183 
185  QgsRectangle extent() const;
186 
187  const QgsMapToPixel* coordinateTransform() { return &( mRenderContext.mapToPixel() ); }
188 
190  double scale() const { return mScale; }
193  void setScale( double scale ) {mScale = scale;}
194  double mapUnitsPerPixel() const { return mMapUnitsPerPixel; }
195 
196  int width() const { return ( int ) mSize.width(); }
197  int height() const { return ( int ) mSize.height(); }
198 
200  void updateScale();
201 
202  QGis::UnitType mapUnits() const;
203  void setMapUnits( QGis::UnitType u );
204 
206  void enableOverviewMode( bool isOverview = true ) { mOverview = isOverview; }
207 
208  void setOutputSize( QSize size, int dpi );
209  void setOutputSize( QSizeF size, double dpi );
210 
212  double outputDpi();
214  QSize outputSize();
215  QSizeF outputSizeF();
216 
222  QgsRectangle layerExtentToOutputExtent( QgsMapLayer* theLayer, QgsRectangle extent );
223 
229  QgsRectangle outputExtentToLayerExtent( QgsMapLayer* theLayer, QgsRectangle extent );
230 
235  QgsPoint layerToMapCoordinates( QgsMapLayer* theLayer, QgsPoint point );
236 
242  QgsRectangle layerToMapCoordinates( QgsMapLayer* theLayer, QgsRectangle rect );
243 
248  QgsPoint mapToLayerCoordinates( QgsMapLayer* theLayer, QgsPoint point );
249 
255  QgsRectangle mapToLayerCoordinates( QgsMapLayer* theLayer, QgsRectangle rect );
256 
258  void setProjectionsEnabled( bool enabled );
259 
261  bool hasCrsTransformEnabled() const;
262 
264  void setDestinationCrs( const QgsCoordinateReferenceSystem& crs, bool refreshCoordinateTransformInfo = true, bool transformExtent = true );
265 
267  const QgsCoordinateReferenceSystem& destinationCrs() const;
268 
269  void setOutputUnits( OutputUnits u ) {mOutputUnits = u;}
270 
271  OutputUnits outputUnits() const {return mOutputUnits;}
272 
274  QgsRectangle fullExtent();
275 
277  QStringList& layerSet();
278 
280  void setLayerSet( const QStringList& layers );
281 
283  void updateFullExtent();
284 
286  bool readXML( QDomNode & theNode );
287 
289  bool writeXML( QDomNode & theNode, QDomDocument & theDoc );
290 
292  QgsRenderContext* rendererContext() {return &mRenderContext;}
293 
295  QgsLabelingEngineInterface* labelingEngine() { return mLabelingEngine; }
296 
299  void setLabelingEngine( QgsLabelingEngineInterface* iface );
300 
302  static QPainter::CompositionMode getCompositionMode( const QgsMapRenderer::BlendMode &blendMode );
304  static QgsMapRenderer::BlendMode getBlendModeEnum( const QPainter::CompositionMode &blendMode );
305 
306  void addLayerCoordinateTransform( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform = -1, int destDatumTransform = -1 );
307  void clearLayerCoordinateTransforms();
308 
309  const QgsCoordinateTransform* transformation( const QgsMapLayer *layer ) const;
310 
313  const QgsMapSettings& mapSettings();
314 
321  bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 );
322 
323  signals:
324 
326  void drawingProgress( int current, int total );
327 
332 #ifndef Q_MOC_RUN
333  Q_DECL_DEPRECATED
334 #endif
335  void hasCrsTransformEnabled( bool flag );
336 
340  void hasCrsTransformEnabledChanged( bool flag );
341 
342  void destinationSrsChanged();
343 
345  void updateMap();
346 
347  void mapUnitsChanged();
348 
350  void drawError( QgsMapLayer* );
351 
354  void extentsChanged();
355 
357  void datumTransformInfoRequested( const QgsMapLayer* ml, const QString& srcAuthId, const QString& destAuthId ) const;
358 
359 
360  public slots:
361 
363  Q_DECL_DEPRECATED void onDrawingProgress( int current, int total );
364 
365  protected:
366 
368  void adjustExtentToSize();
369 
371  static bool mDrawing;
372 
375 
377  double mScale;
378 
381 
384  //
390 
392  bool mOverview;
393 
394  QSizeF mSize;
395 
398 
401 
403  QStringList mLayerSet;
404 
407 
410 
413 
416 
419 
421  QMutex mRenderMutex;
422 
425 
426  QHash< QString, QgsLayerCoordinateTransform > mLayerCoordinateTransformInfo;
427 };
428 
429 #endif
430 
QgsRectangle labelRect
const QgsMapToPixel * coordinateTransform()
A rectangle specified with double values.
Definition: qgsrectangle.h:35
Base class for all map layer types.
Definition: qgsmaplayer.h:48
QgsRenderContext * rendererContext()
Accessor for render context.
QgsLabelPosition(int id, double r, const QVector< QgsPoint > &corners, const QgsRectangle &rect, double w, double h, const QString &layer, const QString &labeltext, const QFont &labelfont, bool upside_down, bool diagram=false, bool pinned=false)
OutputUnits outputUnits() const
OutputUnits mOutputUnits
Output units.
UnitType
Map units that qgis supports.
Definition: qgis.h:229
bool mProjectionsEnabled
detemines whether on the fly projection support is enabled
QgsRectangle mLastExtent
Last extent to we drew so we know if we can used layer render caching or not.
QgsScaleCalculator * mScaleCalculator
scale calculator
void setScale(double scale)
Sets scale for scale based visibility.
static bool mDrawing
indicates drawing in progress
void enableOverviewMode(bool isOverview=true)
sets whether map image will be for overview
virtual int addDiagramLayer(QgsVectorLayer *layer, const QgsDiagramLayerSettings *s)
adds a diagram layer to the labeling engine
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:113
A non GUI class for rendering a map layer set onto a QPainter.
QVector< QgsPoint > cornerPoints
QgsRectangle mExtent
current extent to be drawn
int width() const
The QgsMapSettings class contains configuration for rendering of the map.
QMutex mRenderMutex
Locks rendering loop for concurrent draws.
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:33
QgsCoordinateReferenceSystem * mDestCRS
destination spatial reference system of the projection
QgsDistanceArea * mDistArea
tool for measuring
double mapUnitsPerPixel() const
double scale() const
Scale denominator.
bool mOverview
indicates whether it's map image for overview
A class to represent a point.
Definition: qgspoint.h:63
BlendMode
Blending modes enum defining the available composition modes that can be used when rendering a layer...
Calculates scale for a given combination of canvas size, map extent, and monitor dpi.
General purpose distance and area calculator.
Contains information about the context of a rendering operation.
int height() const
QgsMapSettings mMapSettings
map settings - used only for export in mapSettings() for use in classes that deal with QgsMapSettings...
OutputUnits
Output units for pen width and point marker width/height.
QgsLabelingEngineInterface * labelingEngine()
Labeling engine (NULL if there's no custom engine)
double mScale
Map scale denominator at its current zoom level.
QHash< QString, QgsLayerCoordinateTransform > mLayerCoordinateTransformInfo
Class for storing a coordinate reference system (CRS)
Class for doing transforms between two map coordinate systems.
QStringList mLayerSet
stores array of layers to be rendered (identified by string)
double mMapUnitsPerPixel
map units per pixel
Labeling engine interface.
QgsRenderContext mRenderContext
Encapsulates context of rendering.
virtual void registerDiagramFeature(const QString &layerID, QgsFeature &feat, const QgsRenderContext &context=QgsRenderContext())
called for every diagram feature
Represents a vector layer which manages a vector based data sets.
QgsLabelingEngineInterface * mLabelingEngine
Labeling engine (NULL by default)
double size
Definition: qgssvgcache.cpp:77
void setOutputUnits(OutputUnits u)
QgsRectangle mFullExtent
full extent of the layer set