Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgstiles.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 QGSTILES_H 17 : : #define QGSTILES_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis_sip.h" 21 : : 22 : : #include "qgsrectangle.h" 23 : : 24 : : /** 25 : : * \ingroup core 26 : : * \brief Stores coordinates of a tile in a tile matrix set. Tile matrix is identified 27 : : * by the zoomLevel(), and the position within tile matrix is given by column() 28 : : * and row(). 29 : : * 30 : : * \since QGIS 3.14 31 : : */ 32 : : class CORE_EXPORT QgsTileXYZ 33 : : { 34 : : public: 35 : : //! Constructs a tile identifier from given column, row and zoom level indices 36 : 0 : QgsTileXYZ( int tc = -1, int tr = -1, int tz = -1 ) 37 : 0 : : mColumn( tc ), mRow( tr ), mZoomLevel( tz ) 38 : : { 39 : 0 : } 40 : : 41 : : //! Returns tile's column index (X) 42 : 0 : int column() const { return mColumn; } 43 : : //! Returns tile's row index (Y) 44 : 0 : int row() const { return mRow; } 45 : : //! Returns tile's zoom level (Z) 46 : 0 : int zoomLevel() const { return mZoomLevel; } 47 : : 48 : : //! Returns tile coordinates in a formatted string 49 : 0 : QString toString() const { return QStringLiteral( "X=%1 Y=%2 Z=%3" ).arg( mColumn ).arg( mRow ).arg( mZoomLevel ); } 50 : : 51 : : private: 52 : : int mColumn; 53 : : int mRow; 54 : : int mZoomLevel; 55 : : }; 56 : : 57 : : 58 : : /** 59 : : * \ingroup core 60 : : * \brief Range of tiles in a tile matrix to be rendered. The selection is rectangular, 61 : : * given by start/end row and column numbers. 62 : : * 63 : : * \since QGIS 3.14 64 : : */ 65 : : class CORE_EXPORT QgsTileRange 66 : : { 67 : : public: 68 : : //! Constructs a range of tiles from given span of columns and rows 69 : 0 : QgsTileRange( int c1 = -1, int c2 = -1, int r1 = -1, int r2 = -1 ) 70 : 0 : : mStartColumn( c1 ), mEndColumn( c2 ), mStartRow( r1 ), mEndRow( r2 ) {} 71 : : 72 : : //! Returns whether the range is valid (when all row/column numbers are not negative) 73 : 0 : bool isValid() const { return mStartColumn >= 0 && mEndColumn >= 0 && mStartRow >= 0 && mEndRow >= 0; } 74 : : 75 : : //! Returns index of the first column in the range 76 : 0 : int startColumn() const { return mStartColumn; } 77 : : //! Returns index of the last column in the range 78 : 0 : int endColumn() const { return mEndColumn; } 79 : : //! Returns index of the first row in the range 80 : 0 : int startRow() const { return mStartRow; } 81 : : //! Returns index of the last row in the range 82 : 0 : int endRow() const { return mEndRow; } 83 : : 84 : : private: 85 : : int mStartColumn; 86 : : int mEndColumn; 87 : : int mStartRow; 88 : : int mEndRow; 89 : : }; 90 : : 91 : : 92 : : /** 93 : : * \ingroup core 94 : : * \brief Defines a matrix of tiles for a single zoom level: it is defined by its size (width * \brief height) 95 : : * and map extent that it covers. 96 : : * 97 : : * Please note that we follow the XYZ convention of X/Y axes, i.e. top-left tile has [0,0] coordinate 98 : : * (which is different from TMS convention where bottom-left tile has [0,0] coordinate). 99 : : * 100 : : * \since QGIS 3.14 101 : : */ 102 : 0 : class CORE_EXPORT QgsTileMatrix 103 : : { 104 : : public: 105 : : 106 : : //! Returns a tile matrix for the usual web mercator 107 : : static QgsTileMatrix fromWebMercator( int mZoomLevel ); 108 : : 109 : : //! Returns zoom level of the tile matrix 110 : 0 : int zoomLevel() const { return mZoomLevel; } 111 : : 112 : : //! Returns number of columns of the tile matrix 113 : : int matrixWidth() const { return mMatrixWidth; } 114 : : 115 : : //! Returns number of rows of the tile matrix 116 : 0 : int matrixHeight() const { return mMatrixHeight; } 117 : : 118 : : //! Returns extent of the tile matrix 119 : : QgsRectangle extent() const { return mExtent; } 120 : : 121 : : //! Returns scale denominator of the tile matrix 122 : : double scale() const { return mScaleDenom; } 123 : : 124 : : //! Returns extent of the given tile in this matrix 125 : : QgsRectangle tileExtent( QgsTileXYZ id ) const; 126 : : 127 : : //! Returns center of the given tile in this matrix 128 : : QgsPointXY tileCenter( QgsTileXYZ id ) const; 129 : : 130 : : //! Returns tile range that fully covers the given extent 131 : : QgsTileRange tileRangeFromExtent( const QgsRectangle &mExtent ); 132 : : 133 : : //! Returns row/column coordinates (floating point number) from the given point in map coordinates 134 : : QPointF mapToTileCoordinates( const QgsPointXY &mapPoint ) const; 135 : : 136 : : private: 137 : : //! Zoom level index associated with the tile matrix 138 : : int mZoomLevel; 139 : : //! Number of columns of the tile matrix 140 : : int mMatrixWidth; 141 : : //! Number of rows of the tile matrix 142 : : int mMatrixHeight; 143 : : //! Matrix extent in map units in the CRS of tile matrix set 144 : : QgsRectangle mExtent; 145 : : //! Scale denominator of the map scale associated with the tile matrix 146 : : double mScaleDenom; 147 : : //! Width of a single tile in map units (derived from extent and matrix size) 148 : : double mTileXSpan; 149 : : //! Height of a single tile in map units (derived from extent and matrix size) 150 : : double mTileYSpan; 151 : : }; 152 : : 153 : : #endif // QGSTILES_H