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 
190  void setRotation( double degrees );
191 
194  double rotation() const;
195 
196  const QgsMapToPixel* coordinateTransform() { return &( mRenderContext.mapToPixel() ); }
197 
199  double scale() const { return mScale; }
202  void setScale( double scale ) {mScale = scale;}
203  double mapUnitsPerPixel() const { return mMapUnitsPerPixel; }
204 
205  int width() const { return ( int ) mSize.width(); }
206  int height() const { return ( int ) mSize.height(); }
207 
209  void updateScale();
210 
211  QGis::UnitType mapUnits() const;
212  void setMapUnits( QGis::UnitType u );
213 
215  void enableOverviewMode( bool isOverview = true ) { mOverview = isOverview; }
216 
217  void setOutputSize( QSize size, int dpi );
218  void setOutputSize( QSizeF size, double dpi );
219 
221  double outputDpi();
223  QSize outputSize();
224  QSizeF outputSizeF();
225 
231  QgsRectangle layerExtentToOutputExtent( QgsMapLayer* theLayer, QgsRectangle extent );
232 
238  QgsRectangle outputExtentToLayerExtent( QgsMapLayer* theLayer, QgsRectangle extent );
239 
244  QgsPoint layerToMapCoordinates( QgsMapLayer* theLayer, QgsPoint point );
245 
251  QgsRectangle layerToMapCoordinates( QgsMapLayer* theLayer, QgsRectangle rect );
252 
257  QgsPoint mapToLayerCoordinates( QgsMapLayer* theLayer, QgsPoint point );
258 
264  QgsRectangle mapToLayerCoordinates( QgsMapLayer* theLayer, QgsRectangle rect );
265 
267  void setProjectionsEnabled( bool enabled );
268 
270  bool hasCrsTransformEnabled() const;
271 
273  void setDestinationCrs( const QgsCoordinateReferenceSystem& crs, bool refreshCoordinateTransformInfo = true, bool transformExtent = true );
274 
276  const QgsCoordinateReferenceSystem& destinationCrs() const;
277 
278  void setOutputUnits( OutputUnits u ) {mOutputUnits = u;}
279 
280  OutputUnits outputUnits() const {return mOutputUnits;}
281 
283  QgsRectangle fullExtent();
284 
286  QStringList& layerSet();
287 
289  void setLayerSet( const QStringList& layers );
290 
292  void updateFullExtent();
293 
295  bool readXML( QDomNode & theNode );
296 
298  bool writeXML( QDomNode & theNode, QDomDocument & theDoc );
299 
301  QgsRenderContext* rendererContext() {return &mRenderContext;}
302 
304  QgsLabelingEngineInterface* labelingEngine() { return mLabelingEngine; }
305 
308  void setLabelingEngine( QgsLabelingEngineInterface* iface );
309 
311  static QPainter::CompositionMode getCompositionMode( const QgsMapRenderer::BlendMode &blendMode );
313  static QgsMapRenderer::BlendMode getBlendModeEnum( const QPainter::CompositionMode &blendMode );
314 
315  void addLayerCoordinateTransform( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform = -1, int destDatumTransform = -1 );
316  void clearLayerCoordinateTransforms();
317 
318  const QgsCoordinateTransform* transformation( const QgsMapLayer *layer ) const;
319 
322  const QgsMapSettings& mapSettings();
323 
330  bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 );
331 
332  signals:
333 
335  void drawingProgress( int current, int total );
336 
341 #ifndef Q_MOC_RUN
342  Q_DECL_DEPRECATED
343 #endif
344  void hasCrsTransformEnabled( bool flag );
345 
349  void hasCrsTransformEnabledChanged( bool flag );
350 
351  void destinationSrsChanged();
352 
354  void updateMap();
355 
356  void mapUnitsChanged();
357 
359  void drawError( QgsMapLayer* );
360 
363  void extentsChanged();
364 
367  void rotationChanged( double );
368 
370  void datumTransformInfoRequested( const QgsMapLayer* ml, const QString& srcAuthId, const QString& destAuthId ) const;
371 
372 
373  public slots:
374 
376  Q_DECL_DEPRECATED void onDrawingProgress( int current, int total );
377 
378  protected:
379 
381  void adjustExtentToSize();
382 
384  static bool mDrawing;
385 
388 
390  double mScale;
391 
393  double mRotation;
394 
397 
400  //
406 
408  bool mOverview;
409 
410  QSizeF mSize;
411 
414 
417 
419  QStringList mLayerSet;
420 
423 
426 
429 
432 
435 
437  QMutex mRenderMutex;
438 
441 
442  QHash< QString, QgsLayerCoordinateTransform > mLayerCoordinateTransformInfo;
443 };
444 
445 #endif
446 
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.
double mRotation
Map rotation.
QMutex mRenderMutex
Locks rendering loop for concurrent draws.
Perform transforms between map coordinates and device coordinates.
Definition: qgsmaptopixel.h:34
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