bool QgsRasterProjector::destExtentSize( const QgsRectangle &srcExtent, int srcXSize, int srcYSize, QgsRectangle &destExtent, int &destXSize, int &destYSize ) { if ( srcExtent.isEmpty() || srcXSize <= 0 || srcYSize <= 0 ) { return false; } QgsCoordinateTransform ct( mSrcCRS, mDestCRS, mSrcDatumTransform, mDestDatumTransform ); return extentSize( ct, srcExtent, srcXSize, srcYSize, destExtent, destXSize, destYSize ); }
bool QgsRasterProjector::destExtentSize( const QgsRectangle& theSrcExtent, int theSrcXSize, int theSrcYSize, QgsRectangle& theDestExtent, int& theDestXSize, int& theDestYSize ) { if ( theSrcExtent.isEmpty() || theSrcXSize <= 0 || theSrcYSize <= 0 ) { return false; } const QgsCoordinateTransform* ct = QgsCoordinateTransformCache::instance()->transform( mSrcCRS.authid(), mDestCRS.authid(), mSrcDatumTransform, mDestDatumTransform ); return extentSize( ct, theSrcExtent, theSrcXSize, theSrcYSize, theDestExtent, theDestXSize, theDestYSize ); }
void QgsRasterProjector::calcSrcRowsCols() { // Wee need to calculate minimum cell size in the source // TODO: Think it over better, what is the right source resolution? // Taking distances between cell centers projected to source along source // axis would result in very high resolution // TODO: different resolution for rows and cols ? double myMinSize = std::numeric_limits<double>::max(); if ( mApproximate ) { // For now, we take cell sizes projected to source but not to source axes double myDestColsPerMatrixCell = ( double )mDestCols / mCPCols; double myDestRowsPerMatrixCell = ( double )mDestRows / mCPRows; QgsDebugMsg( QString( "myDestColsPerMatrixCell = %1 myDestRowsPerMatrixCell = %2" ).arg( myDestColsPerMatrixCell ).arg( myDestRowsPerMatrixCell ) ); for ( int i = 0; i < mCPRows - 1; i++ ) { for ( int j = 0; j < mCPCols - 1; j++ ) { QgsPoint myPointA = mCPMatrix[i][j]; QgsPoint myPointB = mCPMatrix[i][j+1]; QgsPoint myPointC = mCPMatrix[i+1][j]; if ( mCPLegalMatrix[i][j] && mCPLegalMatrix[i][j+1] && mCPLegalMatrix[i+1][j] ) { double mySize = sqrt( myPointA.sqrDist( myPointB ) ) / myDestColsPerMatrixCell; if ( mySize < myMinSize ) myMinSize = mySize; mySize = sqrt( myPointA.sqrDist( myPointC ) ) / myDestRowsPerMatrixCell; if ( mySize < myMinSize ) myMinSize = mySize; } } } } else { // take highest from corners, points in in the middle of corners and center (3 x 3 ) const QgsCoordinateTransform* inverseCt = QgsCoordinateTransformCache::instance()->transform( mDestCRS.authid(), mSrcCRS.authid(), mDestDatumTransform, mSrcDatumTransform ); //double QgsRectangle srcExtent; int srcXSize, srcYSize; if ( extentSize( inverseCt, mDestExtent, mDestCols, mDestRows, srcExtent, srcXSize, srcYSize ) ) { double srcXRes = srcExtent.width() / srcXSize; double srcYRes = srcExtent.height() / srcYSize; myMinSize = std::min( srcXRes, srcYRes ); } else { QgsDebugMsg( "Cannot get src extent/size" ); } } // Make it a bit higher resolution // TODO: find the best coefficient, attention, increasing resolution for WMS // is changing WMS content myMinSize *= 0.75; QgsDebugMsg( QString( "mMaxSrcXRes = %1 mMaxSrcYRes = %2" ).arg( mMaxSrcXRes ).arg( mMaxSrcYRes ) ); // mMaxSrcXRes, mMaxSrcYRes may be 0 - no limit (WMS) double myMinXSize = mMaxSrcXRes > myMinSize ? mMaxSrcXRes : myMinSize; double myMinYSize = mMaxSrcYRes > myMinSize ? mMaxSrcYRes : myMinSize; QgsDebugMsg( QString( "myMinXSize = %1 myMinYSize = %2" ).arg( myMinXSize ).arg( myMinYSize ) ); QgsDebugMsg( QString( "mSrcExtent.width = %1 mSrcExtent.height = %2" ).arg( mSrcExtent.width() ).arg( mSrcExtent.height() ) ); // we have to round to keep alignment set in calcSrcExtent mSrcRows = ( int ) qRound( mSrcExtent.height() / myMinYSize ); mSrcCols = ( int ) qRound( mSrcExtent.width() / myMinXSize ); QgsDebugMsg( QString( "mSrcRows = %1 mSrcCols = %2" ).arg( mSrcRows ).arg( mSrcCols ) ); }