Skip to content

Commit 42aed66

Browse files
committed
Merge branch 'raster-pipes-2'
2 parents d039c3f + 1bcd947 commit 42aed66

65 files changed

Lines changed: 4990 additions & 1225 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎python/core/qgsrasterrenderer.sip‎

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ class QgsRasterRenderer
2929
virtual ~QgsRasterRenderer();
3030

3131
virtual QString type() const;
32-
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel ) = 0;
32+
virtual void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
3333

34-
bool usesTransparency( QgsCoordinateReferenceSystem& srcSRS, QgsCoordinateReferenceSystem& dstSRS ) const;
34+
bool usesTransparency() const;
3535

3636
void setOpacity( double opacity );
3737
double opacity() const;
@@ -45,17 +45,6 @@ class QgsRasterRenderer
4545
void setInvertColor( bool invert );
4646
bool invertColor() const;
4747

48-
/**Set resampler for zoomed in scales. Takes ownership of the object*/
49-
void setZoomedInResampler( QgsRasterResampler* r );
50-
const QgsRasterResampler* zoomedInResampler();
51-
52-
/**Set resampler for zoomed out scales. Takes ownership of the object*/
53-
void setZoomedOutResampler( QgsRasterResampler* r );
54-
const QgsRasterResampler* zoomedOutResampler() const;
55-
56-
void setMaxOversampling( double os );
57-
double maxOversampling() const;
58-
5948
/**Get symbology items if provided by renderer*/
6049
virtual void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
6150

@@ -76,7 +65,7 @@ class QgsPalettedRasterRenderer: QgsRasterRenderer
7665
~QgsPalettedRasterRenderer();
7766
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );
7867

79-
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
68+
void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
8069

8170
/**Returns number of colors*/
8271
int nColors() const;
@@ -101,7 +90,7 @@ class QgsMultiBandColorRenderer: QgsRasterRenderer
10190

10291
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );
10392

104-
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
93+
void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
10594

10695
int redBand() const;
10796
void setRedBand( int band );
@@ -137,7 +126,7 @@ class QgsSingleBandPseudoColorRenderer: QgsRasterRenderer
137126

138127
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );
139128

140-
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
129+
void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
141130

142131
/**Takes ownership of the shader*/
143132
void setShader( QgsRasterShader* shader );
@@ -159,7 +148,7 @@ class QgsSingleBandGrayRenderer: QgsRasterRenderer
159148

160149
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );
161150

162-
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
151+
void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
163152

164153
int grayBand() const;
165154
void setGrayBand( int band );
@@ -183,7 +172,7 @@ class QgsSingleBandColorDataRenderer: QgsRasterRenderer
183172

184173
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterDataProvider* provider );
185174

186-
virtual void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
175+
void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
187176

188177
void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;
189178
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class QgsRasterResampleFilter
2+
{
3+
%TypeHeaderCode
4+
#include "qgsrasterresamplefilter.h"
5+
%End
6+
7+
public:
8+
QgsRasterResampleFilter( QgsRasterFace* input = 0 );
9+
~QgsRasterResampleFilter();
10+
11+
void * readBlock( int bandNo, const QgsRectangle & extent, int width, int height );
12+
13+
/**Set resampler for zoomed in scales. Takes ownership of the object*/
14+
void setZoomedInResampler( QgsRasterResampler* r );
15+
const QgsRasterResampler* zoomedInResampler();
16+
17+
/**Set resampler for zoomed out scales. Takes ownership of the object*/
18+
void setZoomedOutResampler( QgsRasterResampler* r );
19+
const QgsRasterResampler* zoomedOutResampler() const;
20+
21+
void setMaxOversampling( double os );
22+
double maxOversampling() const;
23+
24+
virtual void writeXML( QDomDocument& doc, QDomElement& parentElem ) const = 0;
25+
26+
/**Sets base class members from xml. Usually called from create() methods of subclasses*/
27+
void readXML( const QDomElement& rendererElem );
28+
};
29+

‎python/gui/gui.sip‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,7 @@
3737
%Include qgsattributeeditor.sip
3838
%Include qgsfieldvalidator.sip
3939
%Include qgsquerybuilder.sip
40+
%Include qgsrasterformatsaveoptionswidget.sip
4041

4142
%Include symbology-ng-gui.sip
43+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
2+
class QgsRasterFormatSaveOptionsWidget : QWidget
3+
{
4+
%TypeHeaderCode
5+
#include <qgsrasterformatsaveoptionswidget.h>
6+
%End
7+
8+
public:
9+
10+
enum Type
11+
{
12+
Default, // everything except profile buttons (save as dlg)
13+
Full, // everything (options dlg)
14+
Table, // just table
15+
LineEdit // just the line edit
16+
};
17+
18+
QgsRasterFormatSaveOptionsWidget( QWidget* parent = 0, QString format = "GTiff",
19+
QgsRasterFormatSaveOptionsWidget::Type type = Default,
20+
QString provider = "gdal" );
21+
~QgsRasterFormatSaveOptionsWidget();
22+
23+
void setFormat( QString format );
24+
void setProvider( QString provider );
25+
QStringList options() const;
26+
void setType( QgsRasterFormatSaveOptionsWidget::Type type = Default );
27+
28+
public slots:
29+
30+
void apply();
31+
void helpOptions();
32+
bool validateOptions( bool gui = true );
33+
34+
private slots:
35+
36+
void on_mProfileNewButton_clicked();
37+
void on_mProfileDeleteButton_clicked();
38+
void on_mProfileResetButton_clicked();
39+
void on_mOptionsAddButton_clicked();
40+
void on_mOptionsDeleteButton_clicked();
41+
void on_mOptionsLabel_clicked();
42+
void on_mOptionsLineEdit_editingFinished();
43+
void optionsTableChanged();
44+
void optionsTableEnableDeleteButton();
45+
void updateOptions();
46+
void swapOptionsUI( int newIndex = -1 );
47+
48+
private:
49+
50+
QString settingsKey( QString profile ) const;
51+
QString currentProfileKey() const;
52+
QString createOptions( QString profile ) const;
53+
void deleteCreateOptions( QString profile );
54+
void setCreateOptions( );
55+
void setCreateOptions( QString profile, QString options );
56+
void setCreateOptions( QString profile, QStringList list );
57+
QStringList profiles() const;
58+
void updateProfiles();
59+
bool eventFilter(QObject *obj, QEvent *event);
60+
61+
};

‎python/plugins/GdalTools/tools/doMerge.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def __init__(self, iface):
2020
self.inSelector.setType( self.inSelector.FILE )
2121
self.outSelector.setType( self.outSelector.FILE )
2222
self.recurseCheck.hide()
23+
# use this for approx. previous UI
24+
#self.creationOptionsTable.setType(QgsRasterFormatSaveOptionsWidget.Table)
2325

2426
self.outputFormat = Utils.fillRasterOutputFormat()
2527
self.extent = None
@@ -33,8 +35,7 @@ def __init__(self, iface):
3335
(self.recurseCheck, SIGNAL("stateChanged(int)"), self.inputDirCheck),
3436
( self.separateCheck, SIGNAL( "stateChanged( int )" ) ),
3537
( self.pctCheck, SIGNAL( "stateChanged( int )" ) ),
36-
( self.intersectCheck, SIGNAL( "stateChanged( int )" ) ),
37-
(self.creationOptionsTable, [SIGNAL("cellValueChanged(int, int)"), SIGNAL("rowRemoved()")], self.creationGroupBox)
38+
( self.intersectCheck, SIGNAL( "stateChanged( int )" ) )
3839
]
3940
)
4041

‎python/plugins/GdalTools/tools/widgetMerge.ui‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>345</width>
10-
<height>276</height>
9+
<width>371</width>
10+
<height>284</height>
1111
</rect>
1212
</property>
1313
<property name="sizePolicy">
@@ -117,11 +117,11 @@
117117
<bool>false</bool>
118118
</property>
119119
<layout class="QVBoxLayout" name="verticalLayout_2">
120-
<property name="bottomMargin">
120+
<property name="margin">
121121
<number>0</number>
122122
</property>
123123
<item>
124-
<widget class="GdalToolsOptionsTable" name="creationOptionsTable" native="true"/>
124+
<widget class="QgsRasterFormatSaveOptionsWidget" name="creationOptionsTable" native="true"/>
125125
</item>
126126
</layout>
127127
</widget>
@@ -136,9 +136,9 @@
136136
<container>1</container>
137137
</customwidget>
138138
<customwidget>
139-
<class>GdalToolsOptionsTable</class>
139+
<class>QgsRasterFormatSaveOptionsWidget</class>
140140
<extends>QWidget</extends>
141-
<header>optionsTable</header>
141+
<header>qgis.gui</header>
142142
<container>1</container>
143143
</customwidget>
144144
</customwidgets>

‎src/app/legend/qgslegendlayer.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,10 @@ void QgsLegendLayer::addToPopupMenu( QMenu& theMenu )
480480
theMenu.addAction( showNFeaturesAction );
481481
theMenu.addSeparator();
482482
}
483+
else if ( lyr->type() == QgsMapLayer::RasterLayer )
484+
{
485+
theMenu.addAction( tr( "Save As..." ), QgisApp::instance(), SLOT( saveAsRasterFile() ) );
486+
}
483487

484488
// properties goes on bottom of menu for consistency with normal ui standards
485489
// e.g. kde stuff

‎src/app/qgisapp.cpp‎

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,12 @@
159159
#include "qgspythonrunner.h"
160160
#include "qgsquerybuilder.h"
161161
#include "qgsrastercalcdialog.h"
162+
#include "qgsrasterfilewriter.h"
163+
#include "qgsrasteriterator.h"
162164
#include "qgsrasterlayer.h"
163165
#include "qgsrasterlayerproperties.h"
164166
#include "qgsrasterrenderer.h"
167+
#include "qgsrasterlayersaveasdialog.h"
165168
#include "qgsrectangle.h"
166169
#include "qgsrenderer.h"
167170
#include "qgsscalecombobox.h"
@@ -909,7 +912,7 @@ void QgisApp::createActions()
909912
connect( mActionOpenTable, SIGNAL( triggered() ), this, SLOT( attributeTable() ) );
910913
connect( mActionToggleEditing, SIGNAL( triggered() ), this, SLOT( toggleEditing() ) );
911914
connect( mActionSaveEdits, SIGNAL( triggered() ), this, SLOT( saveEdits() ) );
912-
connect( mActionLayerSaveAs, SIGNAL( triggered() ), this, SLOT( saveAsVectorFile() ) );
915+
connect( mActionLayerSaveAs, SIGNAL( triggered() ), this, SLOT( saveAsFile() ) );
913916
connect( mActionLayerSelectionSaveAs, SIGNAL( triggered() ), this, SLOT( saveSelectionAsVectorFile() ) );
914917
connect( mActionRemoveLayer, SIGNAL( triggered() ), this, SLOT( removeLayer() ) );
915918
connect( mActionSetLayerCRS, SIGNAL( triggered() ), this, SLOT( setLayerCRS() ) );
@@ -3865,8 +3868,56 @@ void QgisApp::attributeTable()
38653868
// the dialog will be deleted by itself on close
38663869
}
38673870

3868-
void QgisApp::saveAsVectorFile()
3871+
void QgisApp::saveAsRasterFile()
38693872
{
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+
}
38703921
saveAsVectorFileGeneral( false );
38713922
}
38723923

@@ -6929,7 +6980,8 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
69296980
else if ( layer->type() == QgsMapLayer::RasterLayer )
69306981
{
69316982
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 )
69336985
{
69346986
if ( rlayer->dataProvider()->capabilities() & QgsRasterDataProvider::Size )
69356987
{
@@ -6958,7 +7010,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
69587010
mActionOpenTable->setEnabled( false );
69597011
mActionToggleEditing->setEnabled( false );
69607012
mActionSaveEdits->setEnabled( false );
6961-
mActionLayerSaveAs->setEnabled( false );
7013+
mActionLayerSaveAs->setEnabled( true );
69627014
mActionLayerSelectionSaveAs->setEnabled( false );
69637015
mActionAddFeature->setEnabled( false );
69647016
mActionDeleteSelected->setEnabled( false );

‎src/app/qgisapp.h‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,9 +819,12 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
819819
void saveEdits( QgsMapLayer *layer );
820820

821821
//! save current vector layer
822-
void saveAsVectorFile();
822+
void saveAsFile();
823823
void saveSelectionAsVectorFile();
824824

825+
//! save current raster layer
826+
void saveAsRasterFile();
827+
825828
//! show python console
826829
void showPythonDialog();
827830

0 commit comments

Comments
 (0)