[raster] Allow raster providers to hint whether resampling is beneficial

For some providers, such as tiled WMTS/XYZ/AMS, resampling is not
always visually beneficial and can lead to larger downloads
This commit is contained in:
nirvn 2019-06-25 13:00:55 +07:00 committed by Mathieu Pellerin
parent 063d29b256
commit efeb8b5e32
5 changed files with 26 additions and 15 deletions

View File

@ -75,6 +75,7 @@ Base class for raster data providers.
NoProviderCapabilities,
ReadLayerMetadata,
WriteLayerMetadata,
ProviderHintBenefitsFromResampling
};
typedef QFlags<QgsRasterDataProvider::ProviderCapability> ProviderCapabilities;

View File

@ -99,6 +99,7 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRast
NoProviderCapabilities = 0, //!< Provider has no capabilities
ReadLayerMetadata = 1 << 1, //!< Provider can read layer metadata from data store. Since QGIS 3.0. See QgsDataProvider::layerMetadata()
WriteLayerMetadata = 1 << 2, //!< Provider can write layer metadata to the data store. Since QGIS 3.0. See QgsDataProvider::writeLayerMetadata()
ProviderHintBenefitsFromResampling = 1 << 3 //!< Provider benefits from resampling and should apply user default resampling settings (since QGIS 3.10)
};
//! Provider capabilities

View File

@ -754,26 +754,29 @@ void QgsRasterLayer::setDataProvider( QString const &provider, const QgsDataProv
QgsHueSaturationFilter *hueSaturationFilter = new QgsHueSaturationFilter();
mPipe.set( hueSaturationFilter );
//resampler (must be after renderer)
// resampler (must be after renderer)
QgsRasterResampleFilter *resampleFilter = new QgsRasterResampleFilter();
mPipe.set( resampleFilter );
QgsSettings settings;
QString resampling = settings.value( QStringLiteral( "/Raster/defaultZoomedInResampling" ), QStringLiteral( "nearest neighbour" ) ).toString();
if ( resampling == QStringLiteral( "bilinear" ) )
if ( mDataProvider->providerCapabilities() & QgsRasterDataProvider::ProviderHintBenefitsFromResampling )
{
resampleFilter->setZoomedInResampler( new QgsBilinearRasterResampler() );
QgsSettings settings;
QString resampling = settings.value( QStringLiteral( "/Raster/defaultZoomedInResampling" ), QStringLiteral( "nearest neighbour" ) ).toString();
if ( resampling == QStringLiteral( "bilinear" ) )
{
resampleFilter->setZoomedInResampler( new QgsBilinearRasterResampler() );
}
else if ( resampling == QStringLiteral( "cubic" ) )
{
resampleFilter->setZoomedInResampler( new QgsCubicRasterResampler() );
}
resampling = settings.value( QStringLiteral( "/Raster/defaultZoomedOutResampling" ), QStringLiteral( "nearest neighbour" ) ).toString();
if ( resampling == QStringLiteral( "bilinear" ) )
{
resampleFilter->setZoomedOutResampler( new QgsBilinearRasterResampler() );
}
resampleFilter->setMaxOversampling( settings.value( QStringLiteral( "/Raster/defaultOversampling" ), 2.0 ).toDouble() );
}
else if ( resampling == QStringLiteral( "cubic" ) )
{
resampleFilter->setZoomedInResampler( new QgsCubicRasterResampler() );
}
resampling = settings.value( QStringLiteral( "/Raster/defaultZoomedOutResampling" ), QStringLiteral( "nearest neighbour" ) ).toString();
if ( resampling == QStringLiteral( "bilinear" ) )
{
resampleFilter->setZoomedOutResampler( new QgsBilinearRasterResampler() );
}
resampleFilter->setMaxOversampling( settings.value( QStringLiteral( "/Raster/defaultOversampling" ), 2.0 ).toDouble() );
// projector (may be anywhere in pipe)
QgsRasterProjector *projector = new QgsRasterProjector;

View File

@ -1379,6 +1379,11 @@ QString QgsGdalProvider::description() const
return PROVIDER_DESCRIPTION;
}
QgsRasterDataProvider::ProviderCapabilities QgsGdalProvider::providerCapabilities() const
{
return QgsRasterDataProvider::ProviderHintBenefitsFromResampling;
}
// This is used also by global isValidRasterFileName
QStringList QgsGdalProvider::subLayers( GDALDatasetH dataset )
{

View File

@ -99,6 +99,7 @@ class QgsGdalProvider : public QgsRasterDataProvider, QgsGdalProviderBase
QString name() const override;
QString description() const override;
QgsRasterDataProvider::ProviderCapabilities providerCapabilities() const override;
QgsCoordinateReferenceSystem crs() const override;
QgsRectangle extent() const override;
bool isValid() const override;