QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
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 "qgstextformat.h"
22 #include "qgsvectorlayer.h"
24 
25 #include <QString>
26 
27 QStringList QgsMapSettingsUtils::containsAdvancedEffects( const QgsMapSettings &mapSettings, EffectsCheckFlags flags )
28 {
29  QSet< QString > layers;
30 
31  QgsTextFormat layerFormat;
32  const auto constLayers = mapSettings.layers();
33  for ( QgsMapLayer *layer : constLayers )
34  {
35  if ( layer && layer->isInScaleRange( mapSettings.scale() ) )
36  {
37  bool layerHasAdvancedBlendMode = false;
38  if ( layer->blendMode() != QPainter::CompositionMode_SourceOver )
39  {
41  {
42  layerHasAdvancedBlendMode = !QgsAbstractGeoPdfExporter::compositionModeSupported( layer->blendMode() );
43  }
44  else
45  {
46  layerHasAdvancedBlendMode = true;
47  }
48  }
49 
50  if ( layerHasAdvancedBlendMode )
51  {
52  layers << layer->name();
53  }
54  // if vector layer, check labels and feature blend mode
55  if ( QgsVectorLayer *currentVectorLayer = qobject_cast<QgsVectorLayer *>( layer ) )
56  {
57  if ( currentVectorLayer->featureBlendMode() != QPainter::CompositionMode_SourceOver )
58  {
59  layers << layer->name();
60  }
61  // check label blend modes
62  if ( QgsPalLabeling::staticWillUseLayer( currentVectorLayer ) )
63  {
64  // Check all label blending properties
65  layerFormat.readFromLayer( currentVectorLayer );
66  if ( layerFormat.containsAdvancedEffects() )
67  {
68  layers << layer->name();
69  }
70  }
71  }
72  }
73  }
74 
75  return qgis::setToList( layers );
76 }
77 
78 void QgsMapSettingsUtils::worldFileParameters( const QgsMapSettings &mapSettings, double &a, double &b, double &c, double &d, double &e, double &f )
79 {
80  QgsMapSettings ms = mapSettings;
81 
82  double rotation = ms.rotation();
83  double alpha = rotation / 180 * M_PI;
84 
85  // reset rotation to 0 to calculate world file parameters
86  ms.setRotation( 0 );
87 
88  double xOrigin = ms.visibleExtent().xMinimum() + ( ms.mapUnitsPerPixel() / 2 );
89  double yOrigin = ms.visibleExtent().yMaximum() - ( ms.mapUnitsPerPixel() / 2 );
90 
91  double xCenter = ms.visibleExtent().center().x();
92  double yCenter = ms.visibleExtent().center().y();
93 
94  // scaling matrix
95  double s[6];
96  s[0] = ms.mapUnitsPerPixel();
97  s[1] = 0;
98  s[2] = xOrigin;
99  s[3] = 0;
100  s[4] = -ms.mapUnitsPerPixel();
101  s[5] = yOrigin;
102 
103  // rotation matrix
104  double r[6];
105  r[0] = std::cos( alpha );
106  r[1] = -std::sin( alpha );
107  r[2] = xCenter * ( 1 - std::cos( alpha ) ) + yCenter * std::sin( alpha );
108  r[3] = std::sin( alpha );
109  r[4] = std::cos( alpha );
110  r[5] = - xCenter * std::sin( alpha ) + yCenter * ( 1 - std::cos( alpha ) );
111 
112  // result = rotation x scaling = rotation(scaling(X))
113  a = r[0] * s[0] + r[1] * s[3];
114  b = r[0] * s[1] + r[1] * s[4];
115  c = r[0] * s[2] + r[1] * s[5] + r[2];
116  d = r[3] * s[0] + r[4] * s[3];
117  // Pixel YDim - almost always negative
118  // See https://en.wikipedia.org/wiki/World_file#cite_ref-3, https://github.com/qgis/QGIS/issues/26379
119  e = r[3] * s[1] + r[4] * s[4];
120  f = r[3] * s[2] + r[4] * s[5] + r[5];
121 }
122 
124 {
125  double a, b, c, d, e, f;
126  worldFileParameters( mapSettings, a, b, c, d, e, f );
127 
128  QString content;
129  // Pixel XDim
130  content += qgsDoubleToString( a ) + "\r\n";
131  // Rotation on y axis
132  content += qgsDoubleToString( d ) + "\r\n";
133  // Rotation on x axis
134  content += qgsDoubleToString( b ) + "\r\n";
135  // Pixel YDim
136  content += qgsDoubleToString( e ) + "\r\n";
137  // Origin X (top left cell)
138  content += qgsDoubleToString( c ) + "\r\n";
139  // Origin Y (top left cell)
140  content += qgsDoubleToString( f ) + "\r\n";
141 
142  return content;
143 }
QgsPointXY::y
double y
Definition: qgspointxy.h:48
qgspallabeling.h
QgsPalLabeling::staticWillUseLayer
static bool staticWillUseLayer(const QgsMapLayer *layer)
Called to find out whether a specified layer is used for labeling.
Definition: qgspallabeling.cpp:3558
QgsMapSettings::setRotation
void setRotation(double rotation)
Sets the rotation of the resulting map image, in degrees clockwise.
Definition: qgsmapsettings.cpp:106
QgsRectangle::center
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
Definition: qgsrectangle.h:230
QgsPointXY::x
Q_GADGET double x
Definition: qgspointxy.h:47
QgsMapSettings::mapUnitsPerPixel
double mapUnitsPerPixel() const
Returns the distance in geographical coordinates that equals to one pixel in the map.
Definition: qgsmapsettings.cpp:391
qgsmapsettings.h
qgsDoubleToString
QString qgsDoubleToString(double a, int precision=17)
Returns a string representation of a double.
Definition: qgis.h:275
QgsTextFormat
Container for all settings relating to text rendering.
Definition: qgstextformat.h:40
QgsMapSettings::rotation
double rotation() const
Returns the rotation of the resulting map image, in degrees clockwise.
Definition: qgsmapsettings.cpp:101
qgsmapsettingsutils.h
QgsMapSettingsUtils::EffectsCheckFlag::IgnoreGeoPdfSupportedEffects
@ IgnoreGeoPdfSupportedEffects
Ignore advanced effects which are supported in GeoPDF exports.
QgsMapSettingsUtils::containsAdvancedEffects
static QStringList containsAdvancedEffects(const QgsMapSettings &mapSettings, EffectsCheckFlags flags=QgsMapSettingsUtils::EffectsCheckFlags())
Checks whether any of the layers attached to a map settings object contain advanced effects.
Definition: qgsmapsettingsutils.cpp:27
QgsMapSettings::scale
double scale() const
Returns the calculated map scale.
Definition: qgsmapsettings.cpp:396
QgsRectangle::xMinimum
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:167
QgsMapSettingsUtils::worldFileContent
static QString worldFileContent(const QgsMapSettings &mapSettings)
Creates the content of a world file.
Definition: qgsmapsettingsutils.cpp:123
qgsvectorlayer.h
QgsMapSettingsUtils::worldFileParameters
static void worldFileParameters(const QgsMapSettings &mapSettings, double &a, double &b, double &c, double &d, double &e, double &f)
Computes the six parameters of a world file.
Definition: qgsmapsettingsutils.cpp:78
QgsTextFormat::readFromLayer
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
Definition: qgstextformat.cpp:322
QgsRectangle::yMaximum
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:172
c
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
Definition: porting_processing.dox:1
QgsVectorLayer
Represents a vector layer which manages a vector based data sets.
Definition: qgsvectorlayer.h:387
QgsMapLayer
Base class for all map layer types.
Definition: qgsmaplayer.h:83
qgsabstractgeopdfexporter.h
QgsMapSettings::layers
QList< QgsMapLayer * > layers() const
Gets list of layers for map rendering The layers are stored in the reverse order of how they are rend...
Definition: qgsmapsettings.cpp:282
qgstextformat.h
QgsMapSettings
The QgsMapSettings class contains configuration for rendering of the map.
Definition: qgsmapsettings.h:88
QgsMapSettings::visibleExtent
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
Definition: qgsmapsettings.cpp:371
QgsTextFormat::containsAdvancedEffects
bool containsAdvancedEffects() const
Returns true if any component of the font format requires advanced effects such as blend modes,...
Definition: qgstextformat.cpp:684
QgsAbstractGeoPdfExporter::compositionModeSupported
static bool compositionModeSupported(QPainter::CompositionMode mode)
Returns true if the specified composition mode is supported for layers during GeoPDF exports.
Definition: qgsabstractgeopdfexporter.cpp:139