Skip to content

Commit 654a78d

Browse files
elpasonyalldawson
authored andcommittedApr 17, 2019
Raster transform context
1 parent b3a448a commit 654a78d

File tree

12 files changed

+26
-39
lines changed

12 files changed

+26
-39
lines changed
 

‎python/core/auto_generated/raster/qgsrasterviewport.sip.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ struct QgsRasterViewPort
3131

3232
int mSrcDatumTransform;
3333
int mDestDatumTransform;
34+
35+
QgsCoordinateTransformContext mTransformContext;
3436
};
3537

3638
/************************************************************************

‎src/analysis/processing/qgsalgorithmrasterlogicalop.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ bool QgsRasterBooleanLogicAlgorithmBase::prepareAlgorithm( const QVariantMap &pa
103103
{
104104
input.projector = qgis::make_unique< QgsRasterProjector >();
105105
input.projector->setInput( input.sourceDataProvider.get() );
106-
input.projector->setCrs( layer->crs(), mCrs );
106+
input.projector->setCrs( layer->crs(), mCrs, context.transformContext() );
107107
input.interface = input.projector.get();
108108
}
109109
mInputs.emplace_back( std::move( input ) );

‎src/analysis/processing/qgsalgorithmrasterzonalstats.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ bool QgsRasterLayerZonalStatsAlgorithm::prepareAlgorithm( const QVariantMap &par
140140
{
141141
mProjector = qgis::make_unique< QgsRasterProjector >();
142142
mProjector->setInput( mZonesDataProvider.get() );
143-
mProjector->setCrs( zonesLayer->crs(), layer->crs() );
143+
mProjector->setCrs( zonesLayer->crs(), layer->crs(), context.transformContext() );
144144
mZonesInterface = mProjector.get();
145145
}
146146
break;
@@ -158,7 +158,7 @@ bool QgsRasterLayerZonalStatsAlgorithm::prepareAlgorithm( const QVariantMap &par
158158
{
159159
mProjector = qgis::make_unique< QgsRasterProjector >();
160160
mProjector->setInput( mSourceDataProvider.get() );
161-
mProjector->setCrs( layer->crs(), zonesLayer->crs() );
161+
mProjector->setCrs( layer->crs(), zonesLayer->crs(), context.transformContext() );
162162
mSourceInterface = mProjector.get();
163163
}
164164
break;

‎src/analysis/raster/qgsrastercalculator.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculation( QgsFeedback
176176
if ( uniqueRasterEntries[layerRef.first].raster->crs() != mOutputCrs )
177177
{
178178
QgsRasterProjector proj;
179-
proj.setCrs( ref.raster->crs(), mOutputCrs );
179+
proj.setCrs( ref.raster->crs(), mOutputCrs, ref.raster->dataProvider()->transformContext() );
180180
proj.setInput( ref.raster->dataProvider() );
181181
proj.setPrecision( QgsRasterProjector::Exact );
182182
layerRef.second.reset( proj.block( ref.bandNumber, rect, mNumOutputColumns, 1 ) );
@@ -227,7 +227,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculation( QgsFeedback
227227
if ( it->raster->crs() != mOutputCrs )
228228
{
229229
QgsRasterProjector proj;
230-
proj.setCrs( it->raster->crs(), mOutputCrs );
230+
proj.setCrs( it->raster->crs(), mOutputCrs, it->raster->dataProvider()->transformContext() );
231231
proj.setInput( it->raster->dataProvider() );
232232
proj.setPrecision( QgsRasterProjector::Exact );
233233

@@ -516,7 +516,7 @@ QgsRasterCalculator::Result QgsRasterCalculator::processCalculationGPU( std::uni
516516
if ( ref.layer->crs() != mOutputCrs )
517517
{
518518
QgsRasterProjector proj;
519-
proj.setCrs( ref.layer->crs(), mOutputCrs );
519+
proj.setCrs( ref.layer->crs(), mOutputCrs, ref.layer->dataProvider()->transformContext() );
520520
proj.setInput( ref.layer->dataProvider() );
521521
proj.setPrecision( QgsRasterProjector::Exact );
522522
block.reset( proj.block( ref.band, rect, mNumOutputColumns, 1 ) );

‎src/app/qgisapp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7546,7 +7546,7 @@ QString QgisApp::saveAsRasterFile( QgsRasterLayer *rasterLayer, const bool defau
75467546
if ( d.outputCrs() != rasterLayer->crs() )
75477547
{
75487548
QgsRasterProjector *projector = new QgsRasterProjector;
7549-
projector->setCrs( rasterLayer->crs(), d.outputCrs() );
7549+
projector->setCrs( rasterLayer->crs(), d.outputCrs(), rasterLayer->dataProvider()->transformContext() );
75507550
if ( !pipe->insert( 2, projector ) )
75517551
{
75527552
QgsDebugMsg( QStringLiteral( "Cannot set pipe projector" ) );
@@ -7565,7 +7565,7 @@ QString QgisApp::saveAsRasterFile( QgsRasterLayer *rasterLayer, const bool defau
75657565
QgsDebugMsg( QStringLiteral( "Cannot get pipe projector" ) );
75667566
return QString();
75677567
}
7568-
projector->setCrs( rasterLayer->crs(), d.outputCrs() );
7568+
projector->setCrs( rasterLayer->crs(), d.outputCrs(), rasterLayer->dataProvider()->transformContext() );
75697569
}
75707570

75717571
if ( !pipe->last() )

‎src/core/raster/qgsrasterlayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ void QgsRasterLayer::draw( QPainter *theQPainter,
272272
// params in QgsRasterProjector
273273
if ( projector )
274274
{
275-
projector->setCrs( rasterViewPort->mSrcCRS, rasterViewPort->mDestCRS, rasterViewPort->mSrcDatumTransform, rasterViewPort->mDestDatumTransform );
275+
projector->setCrs( rasterViewPort->mSrcCRS, rasterViewPort->mDestCRS, rasterViewPort->mTransformContext );
276276
}
277277

278278
// Drawer to pipe?

‎src/core/raster/qgsrasterlayerrenderer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ QgsRasterLayerRenderer::QgsRasterLayerRenderer( QgsRasterLayer *layer, QgsRender
163163
mRasterViewPort->mDestCRS = rendererContext.coordinateTransform().destinationCrs();
164164
mRasterViewPort->mSrcDatumTransform = rendererContext.coordinateTransform().sourceDatumTransformId();
165165
mRasterViewPort->mDestDatumTransform = rendererContext.coordinateTransform().destinationDatumTransformId();
166+
mRasterViewPort->mTransformContext = rendererContext.transformContext();
166167
}
167168
else
168169
{
@@ -263,7 +264,7 @@ bool QgsRasterLayerRenderer::render()
263264
// params in QgsRasterProjector
264265
if ( projector )
265266
{
266-
projector->setCrs( mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS, mRasterViewPort->mSrcDatumTransform, mRasterViewPort->mDestDatumTransform );
267+
projector->setCrs( mRasterViewPort->mSrcCRS, mRasterViewPort->mDestCRS, mRasterViewPort->mTransformContext );
267268
}
268269

269270
// Drawer to pipe?

‎src/core/raster/qgsrasterprojector.cpp

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ QgsRasterProjector *QgsRasterProjector::clone() const
3939
projector->mSrcDatumTransform = mSrcDatumTransform;
4040
projector->mDestDatumTransform = mDestDatumTransform;
4141
projector->mPrecision = mPrecision;
42-
projector->mTransformContext = mTransformContext;
4342
return projector;
4443
}
4544

@@ -70,15 +69,15 @@ void QgsRasterProjector::setCrs( const QgsCoordinateReferenceSystem &srcCRS,
7069
mDestCRS = destCRS;
7170
mSrcDatumTransform = srcDatumTransform;
7271
mDestDatumTransform = destDatumTransform;
73-
mTransformContext = QgsCoordinateTransformContext();
74-
mTransformContext.addSourceDestinationDatumTransform( srcCRS, destCRS, srcDatumTransform, destDatumTransform );
7572
}
7673

7774
void QgsRasterProjector::setCrs( const QgsCoordinateReferenceSystem &srcCRS, const QgsCoordinateReferenceSystem &destCRS, QgsCoordinateTransformContext transformContext )
7875
{
7976
mSrcCRS = srcCRS;
8077
mDestCRS = destCRS;
81-
mTransformContext = transformContext;
78+
const auto ctPair { transformContext.calculateDatumTransforms( srcCRS, destCRS ) };
79+
mSrcDatumTransform = ctPair.sourceTransformId;
80+
mDestDatumTransform = ctPair.destinationTransformId;
8281
}
8382

8483

@@ -767,17 +766,7 @@ QgsRasterBlock *QgsRasterProjector::block( int bandNo, QgsRectangle const &exte
767766
return mInput->block( bandNo, extent, width, height, feedback );
768767
}
769768

770-
QgsCoordinateTransform inverseCt;
771-
772-
if ( mSrcDatumTransform != -1 && mDestDatumTransform != -1 )
773-
{
774-
inverseCt = QgsCoordinateTransform( mDestCRS, mSrcCRS, mDestDatumTransform, mSrcDatumTransform );
775-
}
776-
else
777-
{
778-
inverseCt = QgsCoordinateTransform( mDestCRS, mSrcCRS, mTransformContext );
779-
}
780-
769+
const QgsCoordinateTransform inverseCt { mDestCRS, mSrcCRS, mDestDatumTransform, mSrcDatumTransform };
781770
ProjectorData pd( extent, width, height, mInput, inverseCt, mPrecision );
782771

783772
QgsDebugMsgLevel( QStringLiteral( "srcExtent:\n%1" ).arg( pd.srcExtent().toString() ), 4 );
@@ -874,15 +863,7 @@ bool QgsRasterProjector::destExtentSize( const QgsRectangle &srcExtent, int srcX
874863
{
875864
return false;
876865
}
877-
QgsCoordinateTransform ct;
878-
if ( mSrcDatumTransform != -1 && mDestDatumTransform != -1 )
879-
{
880-
ct = QgsCoordinateTransform( mSrcCRS, mDestCRS, mSrcDatumTransform, mDestDatumTransform );
881-
}
882-
else
883-
{
884-
ct = QgsCoordinateTransform( mSrcCRS, mDestCRS, mTransformContext );
885-
}
866+
const QgsCoordinateTransform ct { mSrcCRS, mDestCRS, mSrcDatumTransform, mDestDatumTransform };
886867
return extentSize( ct, srcExtent, srcXSize, srcYSize, destExtent, destXSize, destYSize );
887868
}
888869

‎src/core/raster/qgsrasterprojector.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,6 @@ class CORE_EXPORT QgsRasterProjector : public QgsRasterInterface
122122
//! Requested precision
123123
Precision mPrecision = Approximate;
124124

125-
//! Transform context
126-
QgsCoordinateTransformContext mTransformContext;
127-
128125
};
129126

130127

‎src/core/raster/qgsrasterviewport.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "qgspointxy.h"
2121
#include "qgscoordinatereferencesystem.h"
22+
#include "qgscoordinatetransformcontext.h"
2223
#include "qgsrectangle.h"
2324

2425
/**
@@ -68,6 +69,11 @@ struct CORE_EXPORT QgsRasterViewPort
6869

6970
int mSrcDatumTransform;
7071
int mDestDatumTransform;
72+
73+
/**
74+
* Coordinate transform context
75+
*/
76+
QgsCoordinateTransformContext mTransformContext;
7177
};
7278

7379
#endif //QGSRASTERVIEWPORT_H

‎src/server/services/wcs/qgswcsgetcoverage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ namespace QgsWcs
201201
if ( responseCRS != rLayer->crs() )
202202
{
203203
QgsRasterProjector *projector = new QgsRasterProjector;
204-
projector->setCrs( rLayer->crs(), responseCRS );
204+
projector->setCrs( rLayer->crs(), responseCRS, rLayer->dataProvider()->transformContext() );
205205
if ( !pipe.insert( 2, projector ) )
206206
{
207207
throw QgsRequestNotWellFormedException( QStringLiteral( "Cannot set pipe projector" ) );

‎tests/src/core/testqgsrasterfilewriter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ bool TestQgsRasterFileWriter::writeTest( const QString &rasterName )
159159

160160
// Reprojection not really done
161161
QgsRasterProjector *projector = new QgsRasterProjector;
162-
projector->setCrs( provider->crs(), provider->crs() );
162+
projector->setCrs( provider->crs(), provider->crs(), provider->transformContext() );
163163
if ( !pipe->insert( 2, projector ) )
164164
{
165165
logError( QStringLiteral( "Cannot set pipe projector" ) );

0 commit comments

Comments
 (0)
Please sign in to comment.