From 3fd399dc59bfca2526757de9ff1feb7fd8c84825 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Mon, 20 May 2019 18:02:28 +0200 Subject: [PATCH] Fix export raster as GPKG Fixes #20848 Test added for internal functions because the main functionality is in app. Partially reverts 006b130e8a85dbba9e499642a8493a515cf41aa0 See: https://github.com/qgis/QGIS/commit/006b130e8a85dbba9e499642a8493a515cf41aa0 --- src/gui/qgsrasterlayersaveasdialog.cpp | 7 +- src/gui/qgsrasterlayersaveasdialog.h | 2 + src/ui/qgsrasterlayersaveasdialogbase.ui | 39 +---- tests/src/gui/CMakeLists.txt | 1 + .../src/gui/testqgsrasterlayersavesdialog.cpp | 136 ++++++++++++++++++ 5 files changed, 144 insertions(+), 41 deletions(-) create mode 100644 tests/src/gui/testqgsrasterlayersavesdialog.cpp diff --git a/src/gui/qgsrasterlayersaveasdialog.cpp b/src/gui/qgsrasterlayersaveasdialog.cpp index 1870807f71a..43a70562601 100644 --- a/src/gui/qgsrasterlayersaveasdialog.cpp +++ b/src/gui/qgsrasterlayersaveasdialog.cpp @@ -933,11 +933,8 @@ bool QgsRasterLayerSaveAsDialog::outputLayerExists() const { uri = outputFileName(); } - - std::unique_ptr< QgsRasterLayer > rastLayer( new QgsRasterLayer( uri, "", QStringLiteral( "gdal" ) ) ); - QgsVectorLayer::LayerOptions options { QgsProject::instance()->transformContext() }; - std::unique_ptr< QgsVectorLayer > vectLayer = qgis::make_unique( uri, QString(), QStringLiteral( "ogr" ), options ); - return ( rastLayer->isValid() || vectLayer->isValid() ); + std::unique_ptr< QgsRasterLayer > rastLayer( new QgsRasterLayer( uri, QString( ), QStringLiteral( "gdal" ) ) ); + return rastLayer->isValid(); } void QgsRasterLayerSaveAsDialog::accept() diff --git a/src/gui/qgsrasterlayersaveasdialog.h b/src/gui/qgsrasterlayersaveasdialog.h index 998f354dab7..4139c5aee4b 100644 --- a/src/gui/qgsrasterlayersaveasdialog.h +++ b/src/gui/qgsrasterlayersaveasdialog.h @@ -163,6 +163,8 @@ class GUI_EXPORT QgsRasterLayerSaveAsDialog: public QDialog, private Ui::QgsRast bool outputLayerExists() const; void insertAvailableOutputFormats(); + + friend class TestQgsRasterLayerSaveAsDialog; }; diff --git a/src/ui/qgsrasterlayersaveasdialogbase.ui b/src/ui/qgsrasterlayersaveasdialogbase.ui index a7db878e1bc..de7f0ba56c7 100644 --- a/src/ui/qgsrasterlayersaveasdialogbase.ui +++ b/src/ui/qgsrasterlayersaveasdialogbase.ui @@ -169,8 +169,8 @@ datasets with maximum width and height specified below. 0 0 - 543 - 675 + 541 + 597 @@ -760,38 +760,5 @@ datasets with maximum width and height specified below. - - - mButtonBox - accepted() - QgsRasterLayerSaveAsDialogBase - accept() - - - 254 - 575 - - - 157 - 274 - - - - - mButtonBox - rejected() - QgsRasterLayerSaveAsDialogBase - reject() - - - 322 - 575 - - - 286 - 274 - - - - + diff --git a/tests/src/gui/CMakeLists.txt b/tests/src/gui/CMakeLists.txt index 1241ddffd3f..59e9e48d541 100644 --- a/tests/src/gui/CMakeLists.txt +++ b/tests/src/gui/CMakeLists.txt @@ -149,6 +149,7 @@ ADD_QGIS_TEST(filedownloader testqgsfiledownloader.cpp) ADD_QGIS_TEST(layoutgui testqgslayoutgui.cpp) ADD_QGIS_TEST(layoutview testqgslayoutview.cpp) ADD_QGIS_TEST(valuemapwidgetwrapper testqgsvaluemapwidgetwrapper.cpp) +ADD_QGIS_TEST(rasterlayersavesdialog testqgsrasterlayersavesdialog.cpp) ADD_QGIS_TEST(valuerelationwidgetwrapper testqgsvaluerelationwidgetwrapper.cpp) ADD_QGIS_TEST(relationreferencewidget testqgsrelationreferencewidget.cpp) ADD_QGIS_TEST(featurelistcombobox testqgsfeaturelistcombobox.cpp) diff --git a/tests/src/gui/testqgsrasterlayersavesdialog.cpp b/tests/src/gui/testqgsrasterlayersavesdialog.cpp new file mode 100644 index 00000000000..9642dcab078 --- /dev/null +++ b/tests/src/gui/testqgsrasterlayersavesdialog.cpp @@ -0,0 +1,136 @@ +/*************************************************************************** + testqgsrasterlayersavesdialog.cpp + -------------------------------------- + Date : May 2019 + Copyright : (C) 2019 Alessandro Pasotti + Email : elpaso at itopen dot it + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "qgstest.h" + +#include "qgsrasterlayersaveasdialog.h" +#include "qgsvectorfilewriter.h" +#include "qgsvectorlayer.h" +#include "qgsrasterlayer.h" +#include "qgsrasterfilewriter.h" + +#include "qgsgui.h" + +class TestQgsRasterLayerSaveAsDialog : public QObject +{ + Q_OBJECT + public: + TestQgsRasterLayerSaveAsDialog() = default; + + private slots: + void initTestCase(); // will be called before the first testfunction is executed. + void cleanupTestCase(); // will be called after the last testfunction was executed. + void init(); // will be called before each testfunction is executed. + void cleanup(); // will be called after every testfunction. + void outputLayerExists(); + + private: + + QString prepareDb(); + +}; + +void TestQgsRasterLayerSaveAsDialog::initTestCase() +{ + QgsApplication::init(); + QgsApplication::initQgis(); +} + +void TestQgsRasterLayerSaveAsDialog::cleanupTestCase() +{ + QgsApplication::exitQgis(); +} + +void TestQgsRasterLayerSaveAsDialog::init() +{ +} + +void TestQgsRasterLayerSaveAsDialog::cleanup() +{ +} + +void TestQgsRasterLayerSaveAsDialog::outputLayerExists() +{ + QString fileName { prepareDb() }; + + // Try to add a raster layer to the DB + QString dataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt + QString rasterPath { dataDir + "/landsat.tif" }; + + QgsRasterLayer rl( rasterPath, QStringLiteral( "my_raster" ) ); + QVERIFY( rl.isValid() ); + + QgsRasterLayerSaveAsDialog d( &rl, rl.dataProvider(), rl.extent(), rl.crs(), rl.crs() ); + d.mFormatComboBox->setCurrentIndex( d.mFormatComboBox->findData( QStringLiteral( "GPKG" ) ) ); + QCOMPARE( d.mFormatComboBox->currentData().toString(), QString( "GPKG" ) ); + QVERIFY( ! d.outputLayerExists() ); + d.mFilename->setFilePath( fileName ); + d.mLayerName->setText( QStringLiteral( "my_imported_raster" ) ); + QVERIFY( ! d.outputLayerExists() ); + + // Write the raster into the destination file + auto pipe { *rl.pipe() }; + auto rasterUri { QStringLiteral( "GPKG:%1:%2" ).arg( d.outputFileName() ).arg( d.outputLayerName() ) }; + auto fileWriter { QgsRasterFileWriter( d.outputFileName() ) }; + fileWriter.setCreateOptions( d.createOptions() ); + fileWriter.setOutputFormat( d.outputFormat() ); + fileWriter.setBuildPyramidsFlag( d.buildPyramidsFlag() ); + fileWriter.setPyramidsList( d.pyramidsList() ); + fileWriter.setPyramidsResampling( d.pyramidsResamplingMethod() ); + fileWriter.setPyramidsFormat( d.pyramidsFormat() ); + fileWriter.setPyramidsConfigOptions( d.pyramidsConfigOptions() ); + fileWriter.writeRaster( &pipe, 10, 10, rl.extent(), rl.crs(), rl.transformContext() ); + { + QVERIFY( QgsRasterLayer( rasterUri, QStringLiteral( "my_raster2" ) ).isValid() ); + } + QVERIFY( d.outputLayerExists() ); +} + +QString TestQgsRasterLayerSaveAsDialog::prepareDb() +{ + // Preparation: make a test gpk DB with a vector layer in it + QTemporaryFile tmpFile( QDir::tempPath() + QStringLiteral( "/test_qgsrasterlayersavesdialog_XXXXXX.gpkg" ) ); + tmpFile.setAutoRemove( false ); + tmpFile.open(); + QString fileName( tmpFile.fileName( ) ); + QgsVectorLayer vl( QStringLiteral( "Point?field=firstfield:string(1024)" ), "test_layer", "memory" ); + QgsVectorFileWriter w( fileName, + QStringLiteral( "UTF-8" ), + vl.fields(), + QgsWkbTypes::Point, + vl.crs() ); + QgsFeature f { vl.fields() }; + f.setAttribute( 0, QString( 1024, 'x' ) ); + f.setGeometry( QgsGeometry::fromWkt( QStringLiteral( "point(9 45)" ) ) ); + vl.startEditing(); + vl.addFeature( f ); + QgsVectorFileWriter::SaveVectorOptions options; + options.driverName = QStringLiteral( "GPKG" ); + options.layerName = QStringLiteral( "test_layer" ); + QString errorMessage; + QgsVectorFileWriter::writeAsVectorFormat( + &vl, + fileName, + options, + &errorMessage ); + QgsVectorLayer vl2( QStringLiteral( "%1|layername=test_layer" ).arg( fileName ), "src_test", "ogr" ); + Q_ASSERT( vl2.isValid() ); + return tmpFile.fileName( ); +} + +QGSTEST_MAIN( TestQgsRasterLayerSaveAsDialog ) + +#include "testqgsrasterlayersavesdialog.moc"