QGIS API Documentation  2.6.0-Brighton
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups 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