Skip to content

Commit 4481127

Browse files
committedNov 5, 2018
Fix raster set data source (with test)
1 parent 29cbb23 commit 4481127

File tree

3 files changed

+64
-10
lines changed

3 files changed

+64
-10
lines changed
 

‎src/core/qgsmaplayerlegend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ QList<QgsLayerTreeModelLegendNode *> QgsDefaultRasterLayerLegend::createLayerTre
307307
QList<QgsLayerTreeModelLegendNode *> nodes;
308308

309309
// temporary solution for WMS. Ideally should be done with a delegate.
310-
if ( mLayer->dataProvider()->supportsLegendGraphic() )
310+
if ( mLayer->dataProvider() && mLayer->dataProvider()->supportsLegendGraphic() )
311311
{
312312
nodes << new QgsWmsLegendNode( nodeLayer );
313313
}

‎src/core/raster/qgsrasterlayer.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ QgsRasterLayer::QgsRasterLayer( const QString &uri,
119119
{
120120
QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 );
121121
setProviderType( providerKey );
122-
init();
123122

124123
QgsDataProvider::ProviderOptions providerOptions;
125124

@@ -789,12 +788,21 @@ void QgsRasterLayer::setDataSource( const QString &dataSource, const QString &ba
789788
{
790789
if ( mDataProvider )
791790
closeDataProvider();
791+
792+
init();
793+
794+
for ( int i = mPipe.size() - 1; i >= 0; --i )
795+
{
796+
mPipe.remove( i );
797+
}
798+
792799
mDataSource = dataSource;
793800
mLayerName = baseName;
801+
794802
setDataProvider( provider, options );
803+
795804
if ( mValid )
796805
{
797-
798806
// load default style
799807
bool defaultLoadedFlag = false;
800808
if ( loadDefaultStyleFlag )
@@ -805,14 +813,10 @@ void QgsRasterLayer::setDataSource( const QString &dataSource, const QString &ba
805813
{
806814
setDefaultContrastEnhancement();
807815
}
808-
809-
// TODO: Connect signals from the dataprovider to the qgisapp
810-
811816
emit statusChanged( tr( "QgsRasterLayer created" ) );
812-
813-
// Load default style
814817
}
815818
emit dataSourceChanged();
819+
emit dataChanged();
816820
}
817821

818822
void QgsRasterLayer::closeDataProvider()
@@ -1267,9 +1271,13 @@ QImage QgsRasterLayer::previewAsImage( QSize size, const QColor &bgColor, QImage
12671271
{
12681272
QImage myQImage( size, format );
12691273

1274+
if ( ! isValid( ) )
1275+
return QImage();
1276+
12701277
myQImage.setColor( 0, bgColor.rgba() );
12711278
myQImage.fill( 0 ); //defaults to white, set to transparent for rendering on a map
12721279

1280+
12731281
QgsRasterViewPort *myRasterViewPort = new QgsRasterViewPort();
12741282

12751283
double myMapUnitsPerPixel;

‎tests/src/python/test_qgsrasterlayer.py

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,25 @@
1616
import qgis # NOQA
1717

1818
import os
19+
import filecmp
1920

20-
from qgis.PyQt.QtCore import QFileInfo
21-
from qgis.PyQt.QtGui import QColor
21+
from qgis.PyQt.QtCore import QSize, QFileInfo, Qt, QTemporaryDir
22+
23+
from qgis.PyQt.QtGui import (
24+
QColor,
25+
QImage,
26+
QPainter,
27+
QResizeEvent
28+
)
2229
from qgis.PyQt.QtXml import QDomDocument
2330

31+
2432
from qgis.core import (QgsRaster,
2533
QgsRasterLayer,
2634
QgsReadWriteContext,
2735
QgsColorRampShader,
2836
QgsContrastEnhancement,
37+
QgsDataProvider,
2938
QgsProject,
3039
QgsMapSettings,
3140
QgsPointXY,
@@ -40,6 +49,7 @@
4049
QgsGradientColorRamp)
4150
from utilities import unitTestDataPath
4251
from qgis.testing import start_app, unittest
52+
from qgis.testing.mocked import get_iface
4353

4454
# Convenience instances in case you may need them
4555
# not used in this test
@@ -48,6 +58,14 @@
4858

4959
class TestQgsRasterLayer(unittest.TestCase):
5060

61+
def setUp(self):
62+
self.iface = get_iface()
63+
QgsProject.instance().removeAllMapLayers()
64+
65+
self.iface.mapCanvas().viewport().resize(400, 400)
66+
# For some reason the resizeEvent is not delivered, fake it
67+
self.iface.mapCanvas().resizeEvent(QResizeEvent(QSize(400, 400), self.iface.mapCanvas().size()))
68+
5169
def testIdentify(self):
5270
myPath = os.path.join(unitTestDataPath(), 'landsat.tif')
5371
myFileInfo = QFileInfo(myPath)
@@ -694,6 +712,34 @@ def testClone(self):
694712
# compare xml documents
695713
self.assertEqual(layer_doc.toString(), clone_doc.toString())
696714

715+
def testSetDataSource(self):
716+
"""Test change data source"""
717+
718+
temp_dir = QTemporaryDir()
719+
options = QgsDataProvider.ProviderOptions()
720+
myPath = os.path.join(unitTestDataPath('raster'),
721+
'band1_float32_noct_epsg4326.tif')
722+
myFileInfo = QFileInfo(myPath)
723+
myBaseName = myFileInfo.baseName()
724+
layer = QgsRasterLayer(myPath, myBaseName)
725+
726+
image = layer.previewAsImage(QSize(400, 400))
727+
self.assertFalse(image.isNull())
728+
self.assertTrue(image.save(os.path.join(temp_dir.path(), 'expected.png'), "PNG"))
729+
730+
layer.setDataSource(myPath.replace('4326.tif', '4326-BAD_SOURCE.tif'), 'bad_layer', 'gdal', options)
731+
self.assertFalse(layer.isValid())
732+
image = layer.previewAsImage(QSize(400, 400))
733+
self.assertTrue(image.isNull())
734+
735+
layer.setDataSource(myPath.replace('4326-BAD_SOURCE.tif', '4326.tif'), 'bad_layer', 'gdal', options)
736+
self.assertTrue(layer.isValid())
737+
image = layer.previewAsImage(QSize(400, 400))
738+
self.assertFalse(image.isNull())
739+
self.assertTrue(image.save(os.path.join(temp_dir.path(), 'actual.png'), "PNG"))
740+
741+
self.assertTrue(filecmp.cmp(os.path.join(temp_dir.path(), 'actual.png'), os.path.join(temp_dir.path(), 'expected.png')))
742+
697743

698744
if __name__ == '__main__':
699745
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.