Skip to content

Commit

Permalink
Ensure resampling settings are preserved when cloning raster layers
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed May 16, 2024
1 parent 4a6fdf1 commit c2c1c02
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 4 deletions.
14 changes: 10 additions & 4 deletions src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,10 @@ QgsRasterLayer *QgsRasterLayer::clone() const
{
options.transformContext = mDataProvider->transformContext();
}
QgsRasterLayer *layer = new QgsRasterLayer( source(), name(), mProviderKey, options );
QgsMapLayer::clone( layer );
std::unique_ptr< QgsRasterLayer > layer = std::make_unique< QgsRasterLayer >( source(), name(), mProviderKey, options );
QgsMapLayer::clone( layer.get() );
layer->mElevationProperties = mElevationProperties->clone();
layer->mElevationProperties->setParent( layer );
layer->mElevationProperties->setParent( layer.get() );
layer->setMapTipTemplate( mapTipTemplate() );
layer->setMapTipsEnabled( mapTipsEnabled() );

Expand All @@ -182,8 +182,14 @@ QgsRasterLayer *QgsRasterLayer::clone() const
layer->pipe()->set( mPipe->at( i )->clone() );
}
layer->pipe()->setDataDefinedProperties( mPipe->dataDefinedProperties() );
layer->setResamplingStage( mPipe->resamplingStage() );
if ( mDataProvider && layer->dataProvider() )
{
layer->dataProvider()->setZoomedInResamplingMethod( mDataProvider->zoomedInResamplingMethod() );
layer->dataProvider()->setZoomedOutResamplingMethod( mDataProvider->zoomedOutResamplingMethod() );
}

return layer;
return layer.release();
}

QgsAbstractProfileGenerator *QgsRasterLayer::createProfileGenerator( const QgsProfileRequest &request )
Expand Down
35 changes: 35 additions & 0 deletions tests/src/python/test_qgsrasterlayer.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
QgsReadWriteContext,
QgsSingleBandGrayRenderer,
QgsSingleBandPseudoColorRenderer,
QgsRasterDataProvider,
)
import unittest
from qgis.testing import start_app, QgisTestCase
Expand Down Expand Up @@ -1075,6 +1076,40 @@ def testClone(self):
# compare xml documents
self.assertEqual(layer_doc.toString(), clone_doc.toString())

def test_clone_resampling(self):
"""
Test that cloning copies resampling settings
"""
layer = QgsRasterLayer(
os.path.join(unitTestDataPath('raster'), 'band1_float32_noct_epsg4326.tif'),
'test')
self.assertTrue(layer.isValid())

layer.setResamplingStage(
Qgis.RasterResamplingStage.Provider
)
layer.dataProvider().setZoomedInResamplingMethod(
QgsRasterDataProvider.ResamplingMethod.CubicSpline
)
layer.dataProvider().setZoomedOutResamplingMethod(
QgsRasterDataProvider.ResamplingMethod.Average
)

# clone layer
clone = layer.clone()
self.assertEqual(
clone.resamplingStage(),
Qgis.RasterResamplingStage.Provider
)
self.assertEqual(
clone.dataProvider().zoomedInResamplingMethod(),
QgsRasterDataProvider.ResamplingMethod.CubicSpline
)
self.assertEqual(
clone.dataProvider().zoomedOutResamplingMethod(),
QgsRasterDataProvider.ResamplingMethod.Average
)

def testSetDataSource(self):
"""Test change data source"""

Expand Down

0 comments on commit c2c1c02

Please sign in to comment.