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     bool forceRasterRender() const override;
50 
51   private:
52     void decodeAndDrawTile( const QgsVectorTileRawData &rawTile );
53 
54     // data coming from the vector tile layer
55 
56     //! Type of the source from which we will be loading tiles (e.g. "xyz" or "mbtiles")
57     QString mSourceType;
58     //! Path/URL of the source. Format depends on source type
59     QString mSourcePath;
60 
61     QString mAuthCfg;
62     QString mReferer;
63 
64     //! Minimum zoom level at which source has any valid tiles (negative = unconstrained)
65     int mSourceMinZoom = -1;
66     //! Maximum zoom level at which source has any valid tiles (negative = unconstrained)
67     int mSourceMaxZoom = -1;
68     //! Tile renderer object to do rendering of individual tiles
69     std::unique_ptr<QgsVectorTileRenderer> mRenderer;
70 
71     /**
72      * Label provider that handles registration of labels.
73      * No need to delete: if exists it is owned by labeling engine.
74      */
75     QgsVectorTileLabelProvider *mLabelProvider = nullptr;
76 
77     //! Whether to draw boundaries of tiles (useful for debugging)
78     bool mDrawTileBoundaries = false;
79 
80     // temporary data used during rendering process
81 
82     //! Feedback object that may be used by the caller to cancel the rendering
83     std::unique_ptr<QgsFeedback> mFeedback;
84     //! Zoom level at which we will be rendering
85     int mTileZoom = 0;
86     //! Definition of the tile matrix for our zoom level
87     QgsTileMatrix mTileMatrix;
88     //!< Block of tiles we will be rendering in that zoom level
89     QgsTileRange mTileRange;
90     //! Cached QgsFields object for each sub-layer that will be rendered
91     QMap<QString, QgsFields> mPerLayerFields;
92 
93     //! Cached list of layers required for renderer and labeling
94     QSet< QString > mRequiredLayers;
95 
96     //! Counter of total elapsed time to decode tiles (ms)
97     int mTotalDecodeTime = 0;
98     //! Counter of total elapsed time to render tiles (ms)
99     int mTotalDrawTime = 0;
100 
101     QList< QgsMapClippingRegion > mClippingRegions;
102     double mLayerOpacity = 1.0;
103 };
104 
105 
106 #endif // QGSVECTORTILELAYERRENDERER_H
107