QGIS API Documentation  3.4.15-Madeira (e83d02e274)
qgsmapsettingsutils.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmapsettingsutils.cpp
3  -------------------
4  begin : May 2017
5  copyright : (C) 2017 by Mathieu Pellerin
6  email : nirvn dot asia at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsmapsettings.h"
19 #include "qgsmapsettingsutils.h"
20 #include "qgspallabeling.h"
21 #include "qgstextrenderer.h"
22 #include "qgsvectorlayer.h"
23 
24 #include <QString>
25 
26 const QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSettings )
27 {
28  QSet< QString > layers;
29 
30  QgsTextFormat layerFormat;
31  Q_FOREACH ( QgsMapLayer *layer, mapSettings.layers() )
32  {
33  if ( layer )
34  {
35  if ( layer->blendMode() != QPainter::CompositionMode_SourceOver )
36  {
37  layers << layer->name();
38  }
39  // if vector layer, check labels and feature blend mode
40  QgsVectorLayer *currentVectorLayer = qobject_cast<QgsVectorLayer *>( layer );
41  if ( currentVectorLayer )
42  {
43  if ( !qgsDoubleNear( currentVectorLayer->opacity(), 1.0 ) )
44  {
45  layers << layer->name();
46  }
47  if ( currentVectorLayer->featureBlendMode() != QPainter::CompositionMode_SourceOver )
48  {
49  layers << layer->name();
50  }
51  // check label blend modes
52  if ( QgsPalLabeling::staticWillUseLayer( currentVectorLayer ) )
53  {
54  // Check all label blending properties
55  layerFormat.readFromLayer( currentVectorLayer );
56  if ( layerFormat.containsAdvancedEffects() )
57  {
58  layers << layer->name();
59  }
60  }
61  }
62  }
63  }
64 
65  return layers.toList();
66 }
67 
69 {
70  QgsMapSettings ms = mapSettings;
71 
72  double rotation = ms.rotation();
73  double alpha = rotation / 180 * M_PI;
74 
75  // reset rotation to 0 to calculate world file parameters
76  ms.setRotation( 0 );
77 
78  double xOrigin = ms.visibleExtent().xMinimum() + ( ms.mapUnitsPerPixel() / 2 );
79  double yOrigin = ms.visibleExtent().yMaximum() - ( ms.mapUnitsPerPixel() / 2 );
80 
81  double xCenter = ms.visibleExtent().center().x();
82  double yCenter = ms.visibleExtent().center().y();
83 
84  // scaling matrix
85  double s[6];
86  s[0] = ms.mapUnitsPerPixel();
87  s[1] = 0;
88  s[2] = xOrigin;
89  s[3] = 0;
90  s[4] = -ms.mapUnitsPerPixel();
91  s[5] = yOrigin;
92 
93  // rotation matrix
94  double r[6];
95  r[0] = std::cos( alpha );
96  r[1] = -std::sin( alpha );
97  r[2] = xCenter * ( 1 - std::cos( alpha ) ) + yCenter * std::sin( alpha );
98  r[3] = std::sin( alpha );
99  r[4] = std::cos( alpha );
100  r[5] = - xCenter * std::sin( alpha ) + yCenter * ( 1 - std::cos( alpha ) );
101 
102  // result = rotation x scaling = rotation(scaling(X))
103  double a = r[0] * s[0] + r[1] * s[3];
104  double b = r[0] * s[1] + r[1] * s[4];
105  double c = r[0] * s[2] + r[1] * s[5] + r[2];
106  double d = r[3] * s[0] + r[4] * s[3];
107  // Pixel YDim - almost always negative
108  // See https://en.wikipedia.org/wiki/World_file#cite_ref-3, https://issues.qgis.org/issues/18491
109  double e = r[3] * s[1] + r[4] * s[4];
110  double f = r[3] * s[2] + r[4] * s[5] + r[5];
111 
112  QString content;
113  // Pixel XDim
114  content += qgsDoubleToString( a ) + "\r\n";
115  // Rotation on y axis
116  content += qgsDoubleToString( d ) + "\r\n";
117  // Rotation on x axis
118  content += qgsDoubleToString( b ) + "\r\n";
119  // Pixel YDim
120  content += qgsDoubleToString( e ) + "\r\n";
121  // Origin X (center of top left cell)
122  content += qgsDoubleToString( c ) + "\r\n";
123  // Origin Y (center of top left cell)
124  content += qgsDoubleToString( f ) + "\r\n";
125 
126  return content;
127 }
Base class for all map layer types.
Definition: qgsmaplayer.h:63
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:171
double y
Definition: qgspointxy.h:48
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:278
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
static const QStringList containsAdvancedEffects(const QgsMapSettings &mapSettings)
Checks whether any of the layers attached to a map settings object contain advanced effects...
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
static QString worldFileContent(const QgsMapSettings &mapSettings)
Creates the content of a world file.
The QgsMapSettings class contains configuration for rendering of the map.
static bool staticWillUseLayer(QgsVectorLayer *layer)
called to find out whether the layer is used for labeling
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QList< QgsMapLayer * > layers() const
Gets list of layers for map rendering The layers are stored in the reverse order of how they are rend...
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
QPainter::CompositionMode featureBlendMode() const
Returns the current blending mode for features.
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition: qgis.h:238
QgsPointXY center() const
Returns the center point of the rectangle.
Definition: qgsrectangle.h:229
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
bool containsAdvancedEffects() const
Returns true if any component of the font format requires advanced effects such as blend modes...
double x
Definition: qgspointxy.h:47
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
QString name
Definition: qgsmaplayer.h:67
Container for all settings relating to text rendering.
Represents a vector layer which manages a vector based data sets.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:166
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer&#39;s custom properties (for QGIS 2.x projects).