Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgstiles.cpp 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 : : #include "qgstiles.h" 17 : : 18 : : #include "qgslogger.h" 19 : : 20 : 0 : QgsTileMatrix QgsTileMatrix::fromWebMercator( int zoomLevel ) 21 : : { 22 : 0 : int numTiles = static_cast<int>( pow( 2, zoomLevel ) ); // assuming we won't ever go over 30 zoom levels 23 : 0 : double z0xMin = -20037508.3427892, z0yMin = -20037508.3427892; 24 : 0 : double z0xMax = 20037508.3427892, z0yMax = 20037508.3427892; 25 : 0 : double s0 = 559082264.0287178; // scale denominator at zoom level 0 of GoogleCRS84Quad 26 : : 27 : 0 : QgsTileMatrix tm; 28 : 0 : tm.mZoomLevel = zoomLevel; 29 : 0 : tm.mMatrixWidth = numTiles; 30 : 0 : tm.mMatrixHeight = numTiles; 31 : 0 : tm.mTileXSpan = ( z0xMax - z0xMin ) / tm.mMatrixWidth; 32 : 0 : tm.mTileYSpan = ( z0yMax - z0yMin ) / tm.mMatrixHeight; 33 : 0 : tm.mExtent = QgsRectangle( z0xMin, z0yMin, z0xMax, z0yMax ); 34 : 0 : tm.mScaleDenom = s0 / pow( 2, zoomLevel ); 35 : 0 : return tm; 36 : : } 37 : : 38 : 0 : QgsRectangle QgsTileMatrix::tileExtent( QgsTileXYZ id ) const 39 : : { 40 : 0 : double xMin = mExtent.xMinimum() + mTileXSpan * id.column(); 41 : 0 : double xMax = xMin + mTileXSpan; 42 : 0 : double yMax = mExtent.yMaximum() - mTileYSpan * id.row(); 43 : 0 : double yMin = yMax - mTileYSpan; 44 : 0 : return QgsRectangle( xMin, yMin, xMax, yMax ); 45 : : } 46 : : 47 : 0 : QgsPointXY QgsTileMatrix::tileCenter( QgsTileXYZ id ) const 48 : : { 49 : 0 : double x = mExtent.xMinimum() + mTileXSpan / 2 * id.column(); 50 : 0 : double y = mExtent.yMaximum() - mTileYSpan / 2 * id.row(); 51 : 0 : return QgsPointXY( x, y ); 52 : : } 53 : : 54 : 0 : QgsTileRange QgsTileMatrix::tileRangeFromExtent( const QgsRectangle &r ) 55 : : { 56 : 0 : double x0 = std::clamp( r.xMinimum(), mExtent.xMinimum(), mExtent.xMaximum() ); 57 : 0 : double y0 = std::clamp( r.yMinimum(), mExtent.yMinimum(), mExtent.yMaximum() ); 58 : 0 : double x1 = std::clamp( r.xMaximum(), mExtent.xMinimum(), mExtent.xMaximum() ); 59 : 0 : double y1 = std::clamp( r.yMaximum(), mExtent.yMinimum(), mExtent.yMaximum() ); 60 : 0 : if ( x0 >= x1 || y0 >= y1 ) 61 : 0 : return QgsTileRange(); // nothing to display 62 : : 63 : 0 : double tileX1 = ( x0 - mExtent.xMinimum() ) / mTileXSpan; 64 : 0 : double tileX2 = ( x1 - mExtent.xMinimum() ) / mTileXSpan; 65 : 0 : double tileY1 = ( mExtent.yMaximum() - y1 ) / mTileYSpan; 66 : 0 : double tileY2 = ( mExtent.yMaximum() - y0 ) / mTileYSpan; 67 : : 68 : 0 : QgsDebugMsgLevel( QStringLiteral( "Tile range of edges [%1,%2] - [%3,%4]" ).arg( tileX1 ).arg( tileY1 ).arg( tileX2 ).arg( tileY2 ), 2 ); 69 : : 70 : : // figure out tile range from zoom 71 : 0 : int startColumn = std::clamp( static_cast<int>( floor( tileX1 ) ), 0, mMatrixWidth - 1 ); 72 : 0 : int endColumn = std::clamp( static_cast<int>( floor( tileX2 ) ), 0, mMatrixWidth - 1 ); 73 : 0 : int startRow = std::clamp( static_cast<int>( floor( tileY1 ) ), 0, mMatrixHeight - 1 ); 74 : 0 : int endRow = std::clamp( static_cast<int>( floor( tileY2 ) ), 0, mMatrixHeight - 1 ); 75 : 0 : return QgsTileRange( startColumn, endColumn, startRow, endRow ); 76 : 0 : } 77 : : 78 : 0 : QPointF QgsTileMatrix::mapToTileCoordinates( const QgsPointXY &mapPoint ) const 79 : : { 80 : 0 : double dx = mapPoint.x() - mExtent.xMinimum(); 81 : 0 : double dy = mExtent.yMaximum() - mapPoint.y(); 82 : 0 : return QPointF( dx / mTileXSpan, dy / mTileYSpan ); 83 : : }