@@ -5923,110 +5923,118 @@ void QgisApp::saveAsRasterFile()
59235923 mMapCanvas ->extent (), rasterLayer->crs (),
59245924 mMapCanvas ->mapSettings ().destinationCrs (),
59255925 this );
5926- if ( d.exec () == QDialog::Accepted )
5927- {
5928- QSettings settings;
5929- settings.setValue ( " /UI/lastRasterFileDir" , QFileInfo ( d.outputFileName () ).absolutePath () );
5926+ if ( d.exec () == QDialog::Rejected )
5927+ return ;
59305928
5931- QgsRasterFileWriter fileWriter ( d.outputFileName () );
5932- if ( d.tileMode () )
5933- {
5934- fileWriter.setTiledMode ( true );
5935- fileWriter.setMaxTileWidth ( d.maximumTileSizeX () );
5936- fileWriter.setMaxTileHeight ( d.maximumTileSizeY () );
5937- }
5929+ QSettings settings;
5930+ settings.setValue ( " /UI/lastRasterFileDir" , QFileInfo ( d.outputFileName () ).absolutePath () );
59385931
5939- QProgressDialog pd ( nullptr , tr ( " Abort..." ), 0 , 0 );
5940- // Show the dialo immediately because cloning pipe can take some time (WCS)
5941- pd.setLabelText ( tr ( " Reading raster" ) );
5942- pd.setWindowTitle ( tr ( " Saving raster" ) );
5943- pd.show ();
5944- pd.setWindowModality ( Qt::WindowModal );
5932+ QgsRasterFileWriter fileWriter ( d.outputFileName () );
5933+ if ( d.tileMode () )
5934+ {
5935+ fileWriter.setTiledMode ( true );
5936+ fileWriter.setMaxTileWidth ( d.maximumTileSizeX () );
5937+ fileWriter.setMaxTileHeight ( d.maximumTileSizeY () );
5938+ }
59455939
5946- // TODO: show error dialogs
5947- // TODO: this code should go somewhere else, but probably not into QgsRasterFileWriter
5948- // clone pipe/provider is not really necessary, ready for threads
5949- QScopedPointer<QgsRasterPipe> pipe ( nullptr );
5940+ QProgressDialog pd ( nullptr , tr ( " Abort..." ), 0 , 0 );
5941+ // Show the dialo immediately because cloning pipe can take some time (WCS)
5942+ pd.setLabelText ( tr ( " Reading raster" ) );
5943+ pd.setWindowTitle ( tr ( " Saving raster" ) );
5944+ pd.show ();
5945+ pd.setWindowModality ( Qt::WindowModal );
59505946
5951- if ( d.mode () == QgsRasterLayerSaveAsDialog::RawDataMode )
5952- {
5953- QgsDebugMsg ( " Writing raw data" );
5954- // QgsDebugMsg( QString( "Writing raw data" ).arg( pos ) );
5955- pipe.reset ( new QgsRasterPipe () );
5956- if ( !pipe->set ( rasterLayer->dataProvider ()->clone () ) )
5957- {
5958- QgsDebugMsg ( " Cannot set pipe provider" );
5959- return ;
5960- }
5947+ // TODO: show error dialogs
5948+ // TODO: this code should go somewhere else, but probably not into QgsRasterFileWriter
5949+ // clone pipe/provider is not really necessary, ready for threads
5950+ QScopedPointer<QgsRasterPipe> pipe ( nullptr );
59615951
5962- QgsRasterNuller *nuller = new QgsRasterNuller ();
5963- for ( int band = 1 ; band <= rasterLayer-> dataProvider ()-> bandCount (); band ++ )
5964- {
5965- nuller-> setNoData ( band, d. noData ( ) );
5966- }
5967- if ( !pipe->insert ( 1 , nuller ) )
5968- {
5969- QgsDebugMsg ( " Cannot set pipe nuller " );
5970- return ;
5971- }
5952+ if ( d. mode () == QgsRasterLayerSaveAsDialog::RawDataMode )
5953+ {
5954+ QgsDebugMsg ( " Writing raw data " );
5955+ // QgsDebugMsg( QString( "Writing raw data" ).arg( pos ) );
5956+ pipe. reset ( new QgsRasterPipe () );
5957+ if ( !pipe->set ( rasterLayer-> dataProvider ()-> clone () ) )
5958+ {
5959+ QgsDebugMsg ( " Cannot set pipe provider " );
5960+ return ;
5961+ }
59725962
5973- // add projector if necessary
5974- if ( d.outputCrs () != rasterLayer->crs () )
5975- {
5976- QgsRasterProjector * projector = new QgsRasterProjector;
5977- projector->setCRS ( rasterLayer->crs (), d.outputCrs () );
5978- if ( !pipe->insert ( 2 , projector ) )
5979- {
5980- QgsDebugMsg ( " Cannot set pipe projector" );
5981- return ;
5982- }
5983- }
5963+ QgsRasterNuller *nuller = new QgsRasterNuller ();
5964+ for ( int band = 1 ; band <= rasterLayer->dataProvider ()->bandCount (); band ++ )
5965+ {
5966+ nuller->setNoData ( band, d.noData () );
59845967 }
5985- else // RenderedImageMode
5968+ if ( !pipe-> insert ( 1 , nuller ) )
59865969 {
5987- // clone the whole pipe
5988- QgsDebugMsg ( " Writing rendered image" );
5989- pipe.reset ( new QgsRasterPipe ( *rasterLayer->pipe () ) );
5990- QgsRasterProjector *projector = pipe->projector ();
5991- if ( !projector )
5970+ QgsDebugMsg ( " Cannot set pipe nuller" );
5971+ return ;
5972+ }
5973+
5974+ // add projector if necessary
5975+ if ( d.outputCrs () != rasterLayer->crs () )
5976+ {
5977+ QgsRasterProjector * projector = new QgsRasterProjector;
5978+ projector->setCRS ( rasterLayer->crs (), d.outputCrs () );
5979+ if ( !pipe->insert ( 2 , projector ) )
59925980 {
5993- QgsDebugMsg ( " Cannot get pipe projector" );
5981+ QgsDebugMsg ( " Cannot set pipe projector" );
59945982 return ;
59955983 }
5996- projector->setCRS ( rasterLayer->crs (), d.outputCrs () );
59975984 }
5998-
5999- if ( !pipe->last () )
5985+ }
5986+ else // RenderedImageMode
5987+ {
5988+ // clone the whole pipe
5989+ QgsDebugMsg ( " Writing rendered image" );
5990+ pipe.reset ( new QgsRasterPipe ( *rasterLayer->pipe () ) );
5991+ QgsRasterProjector *projector = pipe->projector ();
5992+ if ( !projector )
60005993 {
5994+ QgsDebugMsg ( " Cannot get pipe projector" );
60015995 return ;
60025996 }
6003- fileWriter.setCreateOptions ( d.createOptions () );
5997+ projector->setCRS ( rasterLayer->crs (), d.outputCrs () );
5998+ }
60045999
6005- fileWriter. setBuildPyramidsFlag ( d. buildPyramidsFlag () );
6006- fileWriter. setPyramidsList ( d. pyramidsList () );
6007- fileWriter. setPyramidsResampling ( d. pyramidsResamplingMethod () ) ;
6008- fileWriter. setPyramidsFormat ( d. pyramidsFormat () );
6009- fileWriter.setPyramidsConfigOptions ( d.pyramidsConfigOptions () );
6000+ if ( !pipe-> last () )
6001+ {
6002+ return ;
6003+ }
6004+ fileWriter.setCreateOptions ( d.createOptions () );
60106005
6011- QgsRasterFileWriter::WriterError err = fileWriter.writeRaster ( pipe.data (), d.nColumns (), d.nRows (), d.outputRectangle (), d.outputCrs (), &pd );
6012- if ( err != QgsRasterFileWriter::NoError )
6013- {
6014- QMessageBox::warning ( this , tr ( " Error" ),
6015- tr ( " Cannot write raster error code: %1" ).arg ( err ),
6016- QMessageBox::Ok );
6006+ fileWriter.setBuildPyramidsFlag ( d.buildPyramidsFlag () );
6007+ fileWriter.setPyramidsList ( d.pyramidsList () );
6008+ fileWriter.setPyramidsResampling ( d.pyramidsResamplingMethod () );
6009+ fileWriter.setPyramidsFormat ( d.pyramidsFormat () );
6010+ fileWriter.setPyramidsConfigOptions ( d.pyramidsConfigOptions () );
60176011
6012+ QgsRasterFileWriter::WriterError err = fileWriter.writeRaster ( pipe.data (), d.nColumns (), d.nRows (), d.outputRectangle (), d.outputCrs (), &pd );
6013+ if ( err != QgsRasterFileWriter::NoError )
6014+ {
6015+ QMessageBox::warning ( this , tr ( " Error" ),
6016+ tr ( " Cannot write raster error code: %1" ).arg ( err ),
6017+ QMessageBox::Ok );
6018+
6019+ }
6020+ else
6021+ {
6022+ QString fileName ( d.outputFileName () );
6023+ if ( d.tileMode () )
6024+ {
6025+ QFileInfo outputInfo ( fileName );
6026+ fileName = QString ( " %1/%2.vrt" ).arg ( fileName, outputInfo.fileName () );
60186027 }
6019- else
6028+
6029+ if ( d.addToCanvas () )
60206030 {
6021- if ( d.addToCanvas () )
6022- {
6023- addRasterLayers ( QStringList ( d.outputFileName () ) );
6024- }
6025- emit layerSavedAs ( rasterLayer, d.outputFileName () );
6026- messageBar ()->pushMessage ( tr ( " Saving done" ),
6027- tr ( " Export to raster file has been completed" ),
6028- QgsMessageBar::INFO , messageTimeout () );
6031+ addRasterLayers ( QStringList ( fileName ) );
60296032 }
6033+
6034+ emit layerSavedAs ( rasterLayer, fileName );
6035+ messageBar ()->pushMessage ( tr ( " Saving done" ),
6036+ tr ( " Export to raster file has been completed" ),
6037+ QgsMessageBar::INFO , messageTimeout () );
60306038 }
60316039}
60326040
0 commit comments