1 /***************************************************************************
2   qgsvectortilelayerrenderer.h
3   --------------------------------------
4   Date                 : March 2020
5   Copyright            : (C) 2020 by Martin Dobias
6   Email                : wonder dot 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 QGSVECTORTILELAYERRENDERER_H
17 #define QGSVECTORTILELAYERRENDERER_H
18 
19 #define SIP_NO_FILE
20 
21 #include "qgsmaplayerrenderer.h"
22 
23 class QgsVectorTileLayer;
24 class QgsVectorTileRawData;
25 class QgsVectorTileLabelProvider;
26 
27 #include "qgsvectortilerenderer.h"
28 #include "qgsmapclippingregion.h"
29 
30 /**
31  * \ingroup core
32  * \brief This class provides map rendering functionality for vector tile layers.
33  * In render() function (assumed to be run in a worker thread) it will:
34  *
35  * # fetch vector tiles using QgsVectorTileLoader
36  * # decode raw tiles into QgsFeature objects using QgsVectorTileDecoder
37  * # render tiles using a class derived from QgsVectorTileRenderer
38  *
39  * \since QGIS 3.14
40  */
41 class QgsVectorTileLayerRenderer : public QgsMapLayerRenderer
42 {
43   public:
44     //! Creates the renderer. Always called from main thread, should copy whatever necessary from the layer
45     QgsVectorTileLayerRenderer( QgsVectorTileLayer *layer, QgsRenderContext &context );
46 
47     virtual bool render() override;
feedback()48     virtual QgsFeedback *feedback() const override { return mFeedback.get(); }
49 
50   private:
51     void decodeAndDrawTile( const QgsVectorTileRawData &rawTile );
52 
53     // data coming from the vector tile layer
54 
55     //! Type of the source from which we will be loading tiles (e.g. "xyz" or "mbtiles")
56     QString mSourceType;
57     //! Path/URL of the source. Format depends on source type
58     QString mSourcePath;
59 
60     QString mAuthCfg;
61     QString mReferer;
62 
63     //! Minimum zoom level at which source has any valid tiles (negative = unconstrained)
64     int mSourceMinZoom = -1;
65     //! Maximum zoom level at which source has any valid tiles (negative = unconstrained)
66     int mSourceMaxZoom = -1;
67     //! Tile renderer object to do rendering of individual tiles
68     std::unique_ptr<QgsVectorTileRenderer> mRenderer;
69 
70     /**
71      * Label provider that handles registration of labels.
72      * No need to delete: if exists it is owned by labeling engine.
73      */
74     QgsVectorTileLabelProvider *mLabelProvider = nullptr;
75 
76     //! Whether to draw boundaries of tiles (useful for debugging)
77     bool mDrawTileBoundaries = false;
78 
79     // temporary data used during rendering process
80 
81     //! Feedback object that may be used by the caller to cancel the rendering
82     std::unique_ptr<QgsFeedback> mFeedback;
83     //! Zoom level at which we will be rendering
84     int mTileZoom = 0;
85     //! Definition of the tile matrix for our zoom level
86     QgsTileMatrix mTileMatrix;
87     //!< Block of tiles we will be rendering in that zoom level
88     QgsTileRange mTileRange;
89     //! Cached QgsFields object for each sub-layer that will be rendered
90     QMap<QString, QgsFields> mPerLayerFields;
91 
92     //! Cached list of layers required for renderer and labeling
93     QSet< QString > mRequiredLayers;
94 
95     //! Counter of total elapsed time to decode tiles (ms)
96     int mTotalDecodeTime = 0;
97     //! Counter of total elapsed time to render tiles (ms)
98     int mTotalDrawTime = 0;
99 
100     QList< QgsMapClippingRegion > mClippingRegions;
101 };
102 
103 
104 #endif // QGSVECTORTILELAYERRENDERER_H
105