QGIS API Documentation 4.3.0-Master (45633be667c)
Loading...
Searching...
No Matches
qgsalgorithmxyztiles.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmxyztiles.h
3 ---------------------
4 begin : August 2023
5 copyright : (C) 2023 by Alexander Bruy
6 email : alexander dot bruy 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#ifndef QGSALGORITHMXYZTILES_H
19#define QGSALGORITHMXYZTILES_H
20
21#include <atomic>
22#include <memory>
23
24#include "qgis_sip.h"
26#include "qgsgpkgtiles.h"
28#include "qgsmbtiles.h"
31#include "qgsrectangle.h"
32#include "qgstiles.h"
33#include "qobjectuniqueptr.h"
34
35#include <QString>
36#include <QThreadPool>
37
38#define SIP_NO_FILE
39
40using namespace Qt::StringLiterals;
41
42
44
45template<typename T> class PendingTilesToWriteQueue;
46
47struct Tile
48{
49 Tile( const int x, const int y, const int z )
50 : x( x )
51 , y( y )
52 , z( z )
53 {}
54
55 int x;
56 int y;
57 int z;
58};
59
60struct MetaTile
61{
62 MetaTile() = default;
63
64 void addTile( const int row, const int col, Tile tileToAdd, const QgsRectangle &extent );
65
66 QMap<QPair<int, int>, Tile> tiles;
67 int rows = 0;
68 int cols = 0;
69 QgsRectangle mExtent;
70};
71
75class QgsXyzTilesBaseAlgorithm : public QgsProcessingAlgorithm
76{
77 public:
78 QString group() const override;
79 QString groupId() const override;
81
82 protected:
86 void createCommonParameters();
87
91 void createTileMatrixParameters();
92
93 bool prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
94
95 void checkLayersUsagePolicy( QgsProcessingFeedback *feedback );
96
97 void startJobs( QgsProcessingFeedback *feedback );
98 void checkPipelineFinished( QgsProcessingFeedback *feedback );
99 virtual void processMetaTile( const MetaTile &metaTile, const QImage &renderedImg, QgsProcessingFeedback *feedback ) = 0;
100
101 std::optional<QgsMapSettings> mapSettingsForTile( const MetaTile &metaTile ) const;
102
103 static constexpr double MERC_MAX = 20037508.342789244;
104
105 QColor mBackgroundColor;
106 int mMinZoom = 12;
107 int mMaxZoom = 12;
108 QList<QgsTileExtentMaxZoomRegion> mMaxZoomRegions;
109 int mMaxZoomLimitIncludingOverrides = 0;
110
111 int mDpi = 96;
112 bool mAntialias = true;
113 int mJpgQuality = 75;
114 int mMetaTileSize = 4;
115 int mThreadsNumber = 1;
116 int mTileWidth = 256;
117 int mTileHeight = 256;
118 bool mSkipEmptyTiles = false;
119 QgsExpressionContext mExpressionContext;
120 QString mTileFormat;
121 QList<QgsMapLayer *> mLayers;
122 QgsRectangle mWgs84Extent;
123 QObjectUniquePtr<QObject> mJobOwner = nullptr;
124
125 QgsCoordinateReferenceSystem mTargetCrs = QgsCoordinateReferenceSystem( u"EPSG:3857"_s );
126 QgsTileMatrix mZ0matrix;
127 QgsRectangle mTileGenerationRegion;
128
129 long long mTotalMetaTiles = 0;
130 std::atomic<long long> mProcessedMetaTiles { 0 };
131 std::atomic<long long> mTilesWritten { 0 };
132 std::atomic<long long> mEmptyTiles { 0 };
133 std::atomic<int> mActivePostProcessingTasks { 0 };
134 QgsCoordinateTransformContext mTransformContext;
135 QString mEllipsoid;
136 QPointer<QEventLoop> mEventLoop;
137 QList<MetaTile> mMetaTiles;
138 QMap<QgsMapRendererSequentialJob *, MetaTile> mRendererJobs;
140 std::unique_ptr<QThreadPool> mPostProcessingPool;
141};
142
143
147class QgsXyzTilesDirectoryAlgorithm : public QgsXyzTilesBaseAlgorithm
148{
149 public:
150 QgsXyzTilesDirectoryAlgorithm() = default;
151 void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
152 QString name() const override;
153 QString displayName() const override;
154 QStringList tags() const override;
155 QString shortHelpString() const override;
156 QString shortDescription() const override;
157 QgsXyzTilesDirectoryAlgorithm *createInstance() const override SIP_FACTORY;
158
159 protected:
160 QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
161
162 void processMetaTile( const MetaTile &metaTile, const QImage &renderedImg, QgsProcessingFeedback *feedback ) override;
163
164 private:
165 bool mTms = false;
166 QString mOutputDir;
167 void doExport( QgsProcessingFeedback *feedback );
168};
169
173class QgsXyzTilesMbtilesAlgorithm : public QgsXyzTilesBaseAlgorithm
174{
175 public:
176 QgsXyzTilesMbtilesAlgorithm() = default;
177 void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
178 QString name() const override;
179 QString displayName() const override;
180 QStringList tags() const override;
181 QString shortDescription() const override;
182 QString shortHelpString() const override;
183 QgsXyzTilesMbtilesAlgorithm *createInstance() const override SIP_FACTORY;
184
185 protected:
186 QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
187 void processMetaTile( const MetaTile &metaTile, const QImage &renderedImg, QgsProcessingFeedback *feedback ) override;
188
189 private:
190 std::unique_ptr<QgsMbTiles> mMbtilesWriter;
191 PendingTilesToWriteQueue<QgsMbTiles::TileData> *mWriteQueue = nullptr;
192 void doExport( QgsProcessingFeedback *feedback );
193};
194
198class QgsXyzTilesGpkgAlgorithm : public QgsXyzTilesBaseAlgorithm
199{
200 public:
201 QgsXyzTilesGpkgAlgorithm() = default;
202 void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
203 QString name() const override;
204 QString displayName() const override;
205 QStringList tags() const override;
206 QString shortDescription() const override;
207 QString shortHelpString() const override;
208 QgsXyzTilesGpkgAlgorithm *createInstance() const override SIP_FACTORY;
209
210 protected:
211 QVariantMap processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
212 void processMetaTile( const MetaTile &metaTile, const QImage &renderedImg, QgsProcessingFeedback *feedback ) override;
213
214 private:
215 std::unique_ptr<QgsGeoPackageTiles> mGpkgWriter;
216 PendingTilesToWriteQueue<QgsGeoPackageTiles::TileData> *mWriteQueue = nullptr;
217 void doExport( QgsProcessingFeedback *feedback );
218};
219
221
222#endif // QGSALGORITHMXYZTILES_H
QFlags< ProcessingAlgorithmFlag > ProcessingAlgorithmFlags
Flags indicating how and when an algorithm operates and should be exposed to users.
Definition qgis.h:3828
ScaleCalculationMethod
Scale calculation logic.
Definition qgis.h:5845
@ HorizontalMiddle
Calculate horizontally, across midle of map.
Definition qgis.h:5847
Abstract base class for processing algorithms.
virtual QString group() const
Returns the name of the group this algorithm belongs to.
virtual bool prepareAlgorithm(const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback)
Prepares the algorithm to run using the specified parameters.
virtual QString groupId() const
Returns the unique ID of the group this algorithm belongs to.
virtual Qgis::ProcessingAlgorithmFlags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
#define SIP_FACTORY
Definition qgis_sip.h:83