QGIS API Documentation  3.0.2-Girona (307d082)
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:56
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
double y
Definition: qgspointxy.h:48
static const QStringList containsAdvancedEffects(const QgsMapSettings &mapSettings)
Checks whether any of the layers attached to a map settings object contain advanced effects...
QList< QgsMapLayer * > layers() const
Get list of layers for map rendering The layers are stored in the reverse order of how they are rende...
QgsRectangle visibleExtent() const
Return the actual extent derived from requested extent that takes takes output image size into accoun...
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
Compare two doubles (but allow some difference)
Definition: qgis.h:251
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
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition: qgis.h:237
double mapUnitsPerPixel() const
Return the distance in geographical coordinates that equals to one pixel in the map.
QPainter::CompositionMode featureBlendMode() const
Returns the current blending mode for features.
double x
Definition: qgspointxy.h:47
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:120
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:125
QString name
Definition: qgsmaplayer.h:60
QgsPointXY center() const
Returns the center point of the rectangle.
Definition: qgsrectangle.h:170
Container for all settings relating to text rendering.
Represents a vector layer which manages a vector based data sets.
bool containsAdvancedEffects() const
Returns true if any component of the font format requires advanced effects such as blend modes...
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer&#39;s custom properties (for QGIS 2.x projects).