Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectortileloader.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 QGSVECTORTILELOADER_H 17 : : #define QGSVECTORTILELOADER_H 18 : : 19 : : #define SIP_NO_FILE 20 : : 21 : : class QByteArray; 22 : : 23 : : #include "qgsvectortilerenderer.h" 24 : : 25 : : /** 26 : : * \ingroup core 27 : : * \brief Keeps track of raw tile data that need to be decoded 28 : : * 29 : : * \since QGIS 3.14 30 : : */ 31 : 0 : class QgsVectorTileRawData 32 : : { 33 : : public: 34 : : //! Constructs a raw tile object 35 : 0 : QgsVectorTileRawData( QgsTileXYZ tileID = QgsTileXYZ(), const QByteArray &raw = QByteArray() ) 36 : 0 : : id( tileID ), data( raw ) {} 37 : : 38 : : //! Tile position in tile matrix set 39 : : QgsTileXYZ id; 40 : : //! Raw tile data 41 : : QByteArray data; 42 : : }; 43 : : 44 : : 45 : : class QNetworkReply; 46 : : class QEventLoop; 47 : : 48 : : class QgsMbTiles; 49 : : 50 : : class QgsTileDownloadManagerReply; 51 : : 52 : : /** 53 : : * \ingroup core 54 : : * \brief The loader class takes care of loading raw vector tile data from a tile source. 55 : : * 56 : : * \since QGIS 3.14 57 : : */ 58 : : class QgsVectorTileLoader : public QObject 59 : : { 60 : 0 : Q_OBJECT 61 : : public: 62 : : 63 : : //! Returns raw tile data for the specified range of tiles. Blocks the caller until all tiles are fetched. 64 : : static QList<QgsVectorTileRawData> blockingFetchTileRawData( const QString &sourceType, 65 : : const QString &sourcePath, 66 : : const QgsTileMatrix &tileMatrix, 67 : : const QPointF &viewCenter, 68 : : const QgsTileRange &range, 69 : : const QString &authid, 70 : : const QString &referer ); 71 : : 72 : : //! Returns raw tile data for a single tile, doing a HTTP request. Block the caller until tile data are downloaded. 73 : : static QByteArray loadFromNetwork( const QgsTileXYZ &id, 74 : : const QgsTileMatrix &tileMatrix, 75 : : const QString &requestUrl, 76 : : const QString &authid, 77 : : const QString &referer ); 78 : : //! Returns raw tile data for a single tile loaded from MBTiles file 79 : : static QByteArray loadFromMBTiles( const QgsTileXYZ &id, QgsMbTiles &mbTileReader ); 80 : : 81 : : // 82 : : // non-static stuff 83 : : // 84 : : 85 : : //! Constructs tile loader for doing asynchronous requests and starts network requests 86 : : QgsVectorTileLoader( const QString &uri, const QgsTileMatrix &tileMatrix, const QgsTileRange &range, const QPointF &viewCenter, 87 : : const QString &authid, const QString &referer, QgsFeedback *feedback ); 88 : : ~QgsVectorTileLoader(); 89 : : 90 : : //! Blocks the caller until all asynchronous requests are finished (with a success or a failure) 91 : : void downloadBlocking(); 92 : : 93 : : private: 94 : : void loadFromNetworkAsync( const QgsTileXYZ &id, const QgsTileMatrix &tileMatrix, const QString &requestUrl ); 95 : : 96 : : private slots: 97 : : void tileReplyFinished(); 98 : : void canceled(); 99 : : 100 : : signals: 101 : : //! Emitted when a tile request has finished. If a tile request has failed, the returned raw tile byte array is empty. 102 : : void tileRequestFinished( const QgsVectorTileRawData &rawTile ); 103 : : 104 : : private: 105 : : //! Event loop used for blocking download 106 : : std::unique_ptr<QEventLoop> mEventLoop; 107 : : //! Feedback object that allows cancellation of pending requests 108 : : QgsFeedback *mFeedback; 109 : : 110 : : QString mAuthCfg; 111 : : QString mReferer; 112 : : 113 : : //! Running tile requests 114 : : QList<QgsTileDownloadManagerReply *> mReplies; 115 : : 116 : : }; 117 : : 118 : : #endif // QGSVECTORTILELOADER_H