QGIS API Documentation  2.13.0-Master
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 = nullptr );
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 static_cast< int >( mSize.width() ); }
212  int height() const { return static_cast< 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( BlendMode blendMode );
319  static QgsMapRenderer::BlendMode getBlendModeEnum( 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 
343  {
344  mRenderContext.setFeatureFilterProvider( ffp );
345  }
346 
347  signals:
348 
350  void drawingProgress( int current, int total );
351 
356 #ifndef Q_MOC_RUN
357  Q_DECL_DEPRECATED
358 #endif
359  void hasCrsTransformEnabled( bool flag );
360 
364  void hasCrsTransformEnabledChanged( bool flag );
365 
366  void destinationSrsChanged();
367 
369  void updateMap();
370 
371  void mapUnitsChanged();
372 
374  void drawError( QgsMapLayer* );
375 
378  void extentsChanged();
379 
382  void rotationChanged( double );
383 
386  void datumTransformInfoRequested( const QgsMapLayer* ml, const QString& srcAuthId, const QString& destAuthId ) const;
387 
388 
389  public slots:
390 
392  Q_DECL_DEPRECATED void onDrawingProgress( int current, int total );
393 
394  protected:
395 
397  void adjustExtentToSize();
398 
400  static bool mDrawing;
401 
404 
406  double mScale;
407 
409  double mRotation;
410 
413 
416  //
422 
424  bool mOverview;
425 
427 
430 
433 
436 
439 
442 
445 
448 
451 
454 
457 
459 };
460 
461 #endif
462 
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:155
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:187
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
void setFeatureFilterProvider(const QgsFeatureFilterProvider *ffp)
Set a feature filter provider to filter the features shown in the map.
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
Abstract interface for use by classes that filter the features of a layer.
A class to represent a point.
Definition: qgspoint.h:65
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 (nullptr 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 (nullptr by default)
void setOutputUnits(OutputUnits u)
QgsRectangle mFullExtent
full extent of the layer set