|
159 | 159 | #include "qgspythonrunner.h" |
160 | 160 | #include "qgsquerybuilder.h" |
161 | 161 | #include "qgsrastercalcdialog.h" |
| 162 | +#include "qgsrasterfilewriter.h" |
| 163 | +#include "qgsrasteriterator.h" |
162 | 164 | #include "qgsrasterlayer.h" |
163 | 165 | #include "qgsrasterlayerproperties.h" |
164 | 166 | #include "qgsrasterrenderer.h" |
| 167 | +#include "qgsrasterlayersaveasdialog.h" |
165 | 168 | #include "qgsrectangle.h" |
166 | 169 | #include "qgsrenderer.h" |
167 | 170 | #include "qgsscalecombobox.h" |
@@ -909,7 +912,7 @@ void QgisApp::createActions() |
909 | 912 | connect( mActionOpenTable, SIGNAL( triggered() ), this, SLOT( attributeTable() ) ); |
910 | 913 | connect( mActionToggleEditing, SIGNAL( triggered() ), this, SLOT( toggleEditing() ) ); |
911 | 914 | connect( mActionSaveEdits, SIGNAL( triggered() ), this, SLOT( saveEdits() ) ); |
912 | | - connect( mActionLayerSaveAs, SIGNAL( triggered() ), this, SLOT( saveAsVectorFile() ) ); |
| 915 | + connect( mActionLayerSaveAs, SIGNAL( triggered() ), this, SLOT( saveAsFile() ) ); |
913 | 916 | connect( mActionLayerSelectionSaveAs, SIGNAL( triggered() ), this, SLOT( saveSelectionAsVectorFile() ) ); |
914 | 917 | connect( mActionRemoveLayer, SIGNAL( triggered() ), this, SLOT( removeLayer() ) ); |
915 | 918 | connect( mActionSetLayerCRS, SIGNAL( triggered() ), this, SLOT( setLayerCRS() ) ); |
@@ -3865,8 +3868,56 @@ void QgisApp::attributeTable() |
3865 | 3868 | // the dialog will be deleted by itself on close |
3866 | 3869 | } |
3867 | 3870 |
|
3868 | | -void QgisApp::saveAsVectorFile() |
| 3871 | +void QgisApp::saveAsRasterFile() |
3869 | 3872 | { |
| 3873 | + QgsRasterLayer* rasterLayer = qobject_cast<QgsRasterLayer *>( activeLayer() ); |
| 3874 | + if ( !rasterLayer ) |
| 3875 | + { |
| 3876 | + return; |
| 3877 | + } |
| 3878 | + |
| 3879 | + QgsRasterLayerSaveAsDialog d( rasterLayer->dataProvider(), mMapCanvas->extent() ); |
| 3880 | + if ( d.exec() == QDialog::Accepted ) |
| 3881 | + { |
| 3882 | + QgsRasterFileWriter fileWriter( d.outputFileName() ); |
| 3883 | + if ( d.tileMode() ) |
| 3884 | + { |
| 3885 | + fileWriter.setTiledMode( true ); |
| 3886 | + fileWriter.setMaxTileWidth( d.maximumTileSizeX() ); |
| 3887 | + fileWriter.setMaxTileHeight( d.maximumTileSizeY() ); |
| 3888 | + } |
| 3889 | + |
| 3890 | + QProgressDialog pd( 0, tr( "Abort..." ), 0, 0 ); |
| 3891 | + pd.setWindowModality( Qt::WindowModal ); |
| 3892 | + QgsRasterDataProvider* provider = rasterLayer->dataProvider(); |
| 3893 | + if ( !provider ) |
| 3894 | + { |
| 3895 | + return; |
| 3896 | + } |
| 3897 | + QgsRasterIterator iterator( provider ); |
| 3898 | + int nRows = -1; //calculate number of rows such that pixels are squares |
| 3899 | + if ( provider->capabilities() & QgsRasterDataProvider::ExactResolution ) |
| 3900 | + { |
| 3901 | + nRows = d.nRows(); |
| 3902 | + } |
| 3903 | + fileWriter.setCreateOptions( d.createOptions() ); |
| 3904 | + |
| 3905 | + fileWriter.writeRaster( &iterator, d.nColumns(), nRows, d.outputRectangle(), rasterLayer->crs(), &pd ); |
| 3906 | + } |
| 3907 | +} |
| 3908 | + |
| 3909 | +void QgisApp::saveAsFile() |
| 3910 | +{ |
| 3911 | + QgsMapLayer* layer = activeLayer(); |
| 3912 | + if ( layer ) |
| 3913 | + { |
| 3914 | + QgsMapLayer::LayerType layerType = layer->type(); |
| 3915 | + if ( layerType == QgsMapLayer::RasterLayer ) |
| 3916 | + { |
| 3917 | + saveAsRasterFile(); |
| 3918 | + } |
| 3919 | + return; |
| 3920 | + } |
3870 | 3921 | saveAsVectorFileGeneral( false ); |
3871 | 3922 | } |
3872 | 3923 |
|
@@ -6929,7 +6980,8 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer ) |
6929 | 6980 | else if ( layer->type() == QgsMapLayer::RasterLayer ) |
6930 | 6981 | { |
6931 | 6982 | const QgsRasterLayer *rlayer = qobject_cast<const QgsRasterLayer *>( layer ); |
6932 | | - if ( rlayer->dataProvider()->dataType( 1 ) != QgsRasterDataProvider::ARGBDataType ) |
| 6983 | + if ( rlayer->dataProvider()->dataType( 1 ) != QgsRasterDataProvider::ARGB32 |
| 6984 | + && rlayer->dataProvider()->dataType( 1 ) != QgsRasterDataProvider::ARGB32_Premultiplied ) |
6933 | 6985 | { |
6934 | 6986 | if ( rlayer->dataProvider()->capabilities() & QgsRasterDataProvider::Size ) |
6935 | 6987 | { |
@@ -6958,7 +7010,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer ) |
6958 | 7010 | mActionOpenTable->setEnabled( false ); |
6959 | 7011 | mActionToggleEditing->setEnabled( false ); |
6960 | 7012 | mActionSaveEdits->setEnabled( false ); |
6961 | | - mActionLayerSaveAs->setEnabled( false ); |
| 7013 | + mActionLayerSaveAs->setEnabled( true ); |
6962 | 7014 | mActionLayerSelectionSaveAs->setEnabled( false ); |
6963 | 7015 | mActionAddFeature->setEnabled( false ); |
6964 | 7016 | mActionDeleteSelected->setEnabled( false ); |
|
0 commit comments