1 /***************************************************************************
2   qgsvectortileutils.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 QGSVECTORTILEUTILS_H
17 #define QGSVECTORTILEUTILS_H
18 
19 #include "qgis_core.h"
20 
21 #define SIP_NO_FILE
22 
23 #include <QSet>
24 
25 class QPointF;
26 class QPolygon;
27 
28 class QgsCoordinateTransform;
29 class QgsFields;
30 class QgsMapToPixel;
31 class QgsRectangle;
32 class QgsVectorLayer;
33 
34 class QgsTileMatrix;
35 class QgsTileRange;
36 class QgsTileXYZ;
37 class QgsVectorTileLayer;
38 
39 /**
40  * \ingroup core
41  * \brief Random utility functions for working with vector tiles
42  *
43  * \since QGIS 3.14
44  */
45 class CORE_EXPORT QgsVectorTileUtils
46 {
47   public:
48 
49     //! Returns a list of tiles in the given tile range
50     static QVector<QgsTileXYZ> tilesInRange( const QgsTileRange &range, int zoomLevel );
51     //! Orders tile requests according to the distance from view center (given in tile matrix coords)
52     static void sortTilesByDistanceFromCenter( QVector<QgsTileXYZ> &tiles, const QPointF &center );
53 
54     /**
55      * Returns polygon (made by four corners of the tile) in screen coordinates
56      *
57      * \throws QgsCsException
58      */
59     static QPolygon tilePolygon( QgsTileXYZ id, const QgsCoordinateTransform &ct, const QgsTileMatrix &tm, const QgsMapToPixel &mtp );
60 
61     //! Returns QgsFields instance based on the set of field names
62     static QgsFields makeQgisFields( QSet<QString> flds );
63 
64     /**
65      * Finds zoom level (assuming GoogleCRS84Quad tile matrix set) given map scale denominator.
66      *
67      * \since QGIS 3.16
68      */
69     static double scaleToZoom( double mapScale );
70 
71     //! Finds best fitting zoom level (assuming GoogleCRS84Quad tile matrix set) given map scale denominator and allowed zoom level range
72     static int scaleToZoomLevel( double mapScale, int sourceMinZoom, int sourceMaxZoom );
73     //! Returns a temporary vector layer for given sub-layer of tile in vector tile layer
74     static QgsVectorLayer *makeVectorLayerForTile( QgsVectorTileLayer *mvt, QgsTileXYZ tileID, const QString &layerName );
75     //! Returns formatted tile URL string replacing {x}, {y}, {z} placeholders (or {-y} instead of {y} for TMS convention)
76     static QString formatXYZUrlTemplate( const QString &url, QgsTileXYZ tile, const QgsTileMatrix &tileMatrix );
77     //! Checks whether the URL template string is correct (contains {x}, {y} / {-y}, {z} placeholders)
78     static bool checkXYZUrlTemplate( const QString &url );
79 };
80 
81 #endif // QGSVECTORTILEUTILS_H
82