QGIS API Documentation  2.12.0-Lyon
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;
56  double width;
57  double height;
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;
88  Q_DECL_DEPRECATED virtual QgsPalLayerSettings& layer( const QString& layerName ) = 0;
91  virtual int prepareDiagramLayer( QgsVectorLayer* layer, QStringList& attrNames, QgsRenderContext& ctx )
92  { Q_UNUSED( layer ); Q_UNUSED( attrNames ); Q_UNUSED( ctx ); return 0; }
95  Q_DECL_DEPRECATED virtual int addDiagramLayer( QgsVectorLayer* layer, const QgsDiagramLayerSettings* s )
96  { Q_UNUSED( layer ); Q_UNUSED( s ); return 0; }
98  virtual void registerFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context, const QString& dxfLayer = QString::null ) = 0;
100  virtual void registerDiagramFeature( const QString& layerID, QgsFeature& feat, QgsRenderContext& context )
101  { Q_UNUSED( layerID ); Q_UNUSED( feat ); Q_UNUSED( context ); }
103  virtual void drawLabeling( QgsRenderContext& context ) = 0;
105  virtual void exit() = 0;
108  Q_DECL_DEPRECATED virtual QList<QgsLabelPosition> labelsAtPosition( const QgsPoint& p ) = 0;
111  Q_DECL_DEPRECATED virtual QList<QgsLabelPosition> labelsWithinRect( const QgsRectangle& r ) = 0;
112 
114  virtual QgsLabelingEngineInterface* clone() = 0;
115 };
116 
117 struct CORE_EXPORT QgsLayerCoordinateTransform
118 {
121  int srcDatumTransform; //-1 if unknown or not specified
123 };
124 
125 // ### QGIS 3: remove QgsMapRenderer in favor of QgsMapRendererJob
126 
131 class CORE_EXPORT QgsMapRenderer : public QObject
132 {
133  Q_OBJECT
134 
135  public:
136 
139  {
141  Pixels
142  //MAP_UNITS probably supported in future versions
143  };
144 
149  {
174  };
175 
177  QgsMapRenderer();
178 
180  ~QgsMapRenderer();
181 
185  void render( QPainter* painter, double* forceWidthScale = 0 );
186 
188  bool setExtent( const QgsRectangle& extent );
189 
191  QgsRectangle extent() const;
192 
196  void setRotation( double degrees );
197 
200  double rotation() const;
201 
202  const QgsMapToPixel* coordinateTransform() { return &( mRenderContext.mapToPixel() ); }
203 
205  double scale() const { return mScale; }
208  void setScale( double scale ) {mScale = scale;}
209  double mapUnitsPerPixel() const { return mMapUnitsPerPixel; }
210 
211  int width() const { return ( int ) mSize.width(); }
212  int height() const { return ( int ) mSize.height(); }
213 
215  void updateScale();
216 
217  QGis::UnitType mapUnits() const;
218  void setMapUnits( QGis::UnitType u );
219 
221  void enableOverviewMode( bool isOverview = true ) { mOverview = isOverview; }
222 
223  void setOutputSize( QSize size, int dpi );
224  void setOutputSize( QSizeF size, double dpi );
225 
227  double outputDpi();
229  QSize outputSize();
230  QSizeF outputSizeF();
231 
237  QgsRectangle layerExtentToOutputExtent( QgsMapLayer* theLayer, QgsRectangle extent );
238 
244  QgsRectangle outputExtentToLayerExtent( QgsMapLayer* theLayer, QgsRectangle extent );
245 
250  QgsPoint layerToMapCoordinates( QgsMapLayer* theLayer, QgsPoint point );
251 
257  QgsRectangle layerToMapCoordinates( QgsMapLayer* theLayer, QgsRectangle rect );
258 
263  QgsPoint mapToLayerCoordinates( QgsMapLayer* theLayer, QgsPoint point );
264 
270  QgsRectangle mapToLayerCoordinates( QgsMapLayer* theLayer, QgsRectangle rect );
271 
273  void setProjectionsEnabled( bool enabled );
274 
276  bool hasCrsTransformEnabled() const;
277 
279  void setDestinationCrs( const QgsCoordinateReferenceSystem& crs, bool refreshCoordinateTransformInfo = true, bool transformExtent = true );
280 
282  const QgsCoordinateReferenceSystem& destinationCrs() const;
283 
284  void setOutputUnits( OutputUnits u ) {mOutputUnits = u;}
285 
286  OutputUnits outputUnits() const {return mOutputUnits;}
287 
289  QgsRectangle fullExtent();
290 
292  QStringList& layerSet();
293 
295  void setLayerSet( const QStringList& layers );
296 
298  void updateFullExtent();
299 
301  bool readXML( QDomNode & theNode );
302 
304  bool writeXML( QDomNode & theNode, QDomDocument & theDoc );
305 
307  QgsRenderContext* rendererContext() {return &mRenderContext;}
308 
310  QgsLabelingEngineInterface* labelingEngine() { return mLabelingEngine; }
311 
314  void setLabelingEngine( QgsLabelingEngineInterface* iface );
315 
317  static QPainter::CompositionMode getCompositionMode( const QgsMapRenderer::BlendMode &blendMode );
319  static QgsMapRenderer::BlendMode getBlendModeEnum( const QPainter::CompositionMode &blendMode );
320 
321  void addLayerCoordinateTransform( const QString& layerId, const QString& srcAuthId, const QString& destAuthId, int srcDatumTransform = -1, int destDatumTransform = -1 );
322  void clearLayerCoordinateTransforms();
323 
324  const QgsCoordinateTransform* transformation( const QgsMapLayer *layer ) const;
325 
328  const QgsMapSettings& mapSettings();
329 
336  bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 );
337 
338  signals:
339 
341  void drawingProgress( int current, int total );
342 
347 #ifndef Q_MOC_RUN
348  Q_DECL_DEPRECATED
349 #endif
350  void hasCrsTransformEnabled( bool flag );
351 
355  void hasCrsTransformEnabledChanged( bool flag );
356 
357  void destinationSrsChanged();
358 
360  void updateMap();
361 
362  void mapUnitsChanged();
363 
365  void drawError( QgsMapLayer* );
366 
369  void extentsChanged();
370 
373  void rotationChanged( double );
374 
376  void datumTransformInfoRequested( const QgsMapLayer* ml, const QString& srcAuthId, const QString& destAuthId ) const;
377 
378 
379  public slots:
380 
382  Q_DECL_DEPRECATED void onDrawingProgress( int current, int total );
383 
384  protected:
385 
387  void adjustExtentToSize();
388 
390  static bool mDrawing;
391 
394 
396  double mScale;
397 
399  double mRotation;
400 
403 
406  //
412 
414  bool mOverview;
415 
417 
420 
423 
426 
429 
432 
435 
438 
441 
444 
447 
449 };
450 
451 #endif
452 
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:49
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:147
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
virtual int prepareDiagramLayer(QgsVectorLayer *layer, QStringList &attrNames, QgsRenderContext &ctx)
adds a diagram layer to the labeling engine
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
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:176
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.
virtual Q_DECL_DEPRECATED int addDiagramLayer(QgsVectorLayer *layer, const QgsDiagramLayerSettings *s)
adds a diagram layer to the labeling engine
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.
virtual void registerDiagramFeature(const QString &layerID, QgsFeature &feat, QgsRenderContext &context)
called for every diagram feature
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.
Represents a vector layer which manages a vector based data sets.
QgsLabelingEngineInterface * mLabelingEngine
Labeling engine (NULL by default)
void setOutputUnits(OutputUnits u)
QgsRectangle mFullExtent
full extent of the layer set