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