Skip to content

Commit 6002e6f

Browse files
committedJul 11, 2012
Changes to raster iterator
1 parent 15284eb commit 6002e6f

File tree

6 files changed

+60
-41
lines changed

6 files changed

+60
-41
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
#include "qgsquerybuilder.h"
160160
#include "qgsrastercalcdialog.h"
161161
#include "qgsrasterfilewriter.h"
162+
#include "qgsrasteriterator.h"
162163
#include "qgsrasterlayer.h"
163164
#include "qgsrasterlayerproperties.h"
164165
#include "qgsrasterrenderer.h"
@@ -3784,7 +3785,8 @@ void QgisApp::saveAsRasterFile()
37843785

37853786
QProgressDialog pd( 0, tr( "Abort..." ), 0, 0 );
37863787
pd.setWindowModality( Qt::WindowModal );
3787-
fileWriter.writeRaster( rasterLayer->dataProvider(), d.nColumns(), d.outputRectangle(), &pd );
3788+
QgsRasterIterator iterator( rasterLayer->pipe()->last() );
3789+
fileWriter.writeRaster( &iterator, d.nColumns(), d.outputRectangle(), &pd );
37883790
}
37893791
}
37903792

‎src/core/raster/qgsrasterdrawer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void QgsRasterDrawer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsM
4141

4242
// last pipe filter has only 1 band
4343
int bandNumber = 1;
44-
mIterator->startRasterRead( bandNumber, viewPort, theQgsMapToPixel );
44+
mIterator->startRasterRead( bandNumber, viewPort->drawableAreaXDim, viewPort->drawableAreaYDim, viewPort->mDrawnExtent );
4545

4646
//number of cols/rows in output pixels
4747
int nCols = 0;
@@ -59,7 +59,7 @@ void QgsRasterDrawer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsM
5959
void* rasterData;
6060

6161
// readNextRasterPart calcs and resets nCols, nRows, topLeftCol, topLeftRow
62-
while ( mIterator->readNextRasterPart( bandNumber, viewPort, nCols, nRows,
62+
while ( mIterator->readNextRasterPart( bandNumber, nCols, nRows,
6363
&rasterData, topLeftCol, topLeftRow ) )
6464
{
6565
//create image

‎src/core/raster/qgsrasterfilewriter.cpp

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,33 @@ QgsRasterFileWriter::~QgsRasterFileWriter()
2525

2626
}
2727

28-
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterDataProvider* sourceProvider, int nCols, QgsRectangle outputExtent, QProgressDialog* p )
28+
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIterator* iter, int nCols, QgsRectangle outputExtent, QProgressDialog* p )
2929
{
30-
return NoError;
31-
#if 0
32-
if ( !sourceProvider || ! sourceProvider->isValid() )
30+
if ( !iter )
3331
{
3432
return SourceProviderError;
3533
}
3634

35+
const QgsRasterInterface* iface = iter->input();
36+
if ( !iface )
37+
{
38+
return SourceProviderError;
39+
}
40+
41+
#if 0
3742
if ( outputExtent.isEmpty() )
3843
{
3944
outputExtent = sourceProvider->extent();
4045
}
46+
#endif //0
4147

4248
mProgressDialog = p;
4349

44-
QgsRasterInterface::DataType inputDataType = ( QgsRasterInterface::DataType )sourceProvider->dataType( 1 );
45-
if ( inputDataType == QgsRasterInterface::::ARGBDataType && sourceProvider->bandCount() == 1 )
50+
QgsRasterInterface::DataType debug = iface->dataType( 1 );
51+
52+
if ( iface->dataType( 1 ) == QgsRasterInterface::ARGB32 )
4653
{
47-
WriterError e = writeARGBRaster( sourceProvider, nCols, outputExtent );
54+
WriterError e = writeARGBRaster( iter, nCols, outputExtent );
4855
mProgressDialog = 0;
4956
return e;
5057
}
@@ -54,10 +61,9 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterData
5461
mProgressDialog = 0;
5562
return NoError;
5663
}
57-
#endif //0
5864
}
5965

60-
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRasterSingleTile( QgsRasterDataProvider* sourceProvider, int nCols )
66+
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRasterSingleTile( QgsRasterIterator* iter, int nCols )
6167
{
6268
#if 0
6369
if ( !sourceProvider || ! sourceProvider->isValid() )
@@ -156,22 +162,20 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRasterSingleTile( Qgs
156162
return NoError;
157163
}
158164

159-
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRasterDataProvider* sourceProvider, int nCols, const QgsRectangle& outputExtent )
165+
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRasterIterator* iter, int nCols, const QgsRectangle& outputExtent )
160166
{
161167
#if 0
162-
if ( !sourceProvider || ! sourceProvider->isValid() )
168+
if ( !iter )
163169
{
164170
return SourceProviderError;
165171
}
166172

167-
QgsRasterInterface::DataType sourceDataType = ( QgsRasterInterface::DataType )sourceProvider->dataType( 1 );
168-
int nInputBands = sourceProvider->bandCount();
169-
if ( sourceDataType != QgsRasterInterface::ARGBDataType || nInputBands != 1 )
173+
const QgsRasterInterface* iface = iter->input();
174+
if ( !iface || iface->dataType( 1 ) != QgsRasterInterface::ARGB32 )
170175
{
171176
return SourceProviderError;
172177
}
173178

174-
175179
//create directory for output files
176180
QDir destDir( mOutputUrl );
177181
if ( mTiledMode )
@@ -185,7 +189,8 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRaster
185189
QgsRasterIterator iter( 1, sourceProvider );
186190
iter.setMaximumTileWidth( mMaxTileWidth );
187191
iter.setMaximumTileHeight( mMaxTileHeight );
188-
void* data = VSIMalloc( sourceProvider->dataTypeSize( 1 ) * mMaxTileWidth * mMaxTileHeight );
192+
193+
void* data = VSIMalloc( iface->typeSize( QgsRasterInterface::ARGB32 ) * mMaxTileWidth * mMaxTileHeight );
189194
void* redData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
190195
void* greenData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
191196
void* blueData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
@@ -208,9 +213,13 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRaster
208213
geoTransform[4] = 0.0;
209214
geoTransform[5] = -pixelSize;
210215

216+
//where to get CRS from?
217+
QgsCoordinateReferenceSystem fakeCRS;
218+
fakeCRS.createFromEpsg( 21781 );
219+
211220
if ( mTiledMode )
212221
{
213-
createVRT( nCols, nRows, sourceProvider->crs(), geoTransform );
222+
createVRT( nCols, nRows, fakeCRS, geoTransform );
214223
}
215224
else
216225
{
@@ -221,14 +230,21 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRaster
221230
}
222231

223232
if ( !destProvider->create( mOutputFormat, 4, QgsRasterInterface::Byte, nCols, nRows, geoTransform,
224-
sourceProvider->crs() ) )
233+
fakeCRS ) )
225234
{
226235
delete destProvider;
227236
return CreateDatasourceError;
228237
}
229238
}
230239

231-
iter.select( outputExtent, outputMapUnitsPerPixel );
240+
QgsRasterViewPort viewPort;
241+
viewPort.drawableAreaXDim = nCols;
242+
viewPort.drawableAreaYDim = nRows;
243+
244+
QgsMapUnitsPerPixel mup;
245+
246+
//iter->select( outputExtent, outputMapUnitsPerPixel );
247+
iter->startRasterRead( 1, &viewPort, &mup );
232248

233249
//initialize progress dialog
234250
int nTiles = iter.nTilesX() * iter.nTilesY();
@@ -239,7 +255,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRaster
239255
mProgressDialog->show();
240256
}
241257

242-
while ( iter.nextPart( data, mapRect, iterLeft, iterTop, iterCols, iterRows, progress ) )
258+
while ( iter->nextPart( data, mapRect, iterLeft, iterTop, iterCols, iterRows, progress ) )
243259
{
244260
if ( iterCols <= 5 || iterRows <= 5 ) //some wms servers don't like small values
245261
{
@@ -299,7 +315,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeARGBRaster( QgsRaster
299315
geoTransform[4] = 0.0;
300316
geoTransform[5] = -outputMapUnitsPerPixel;
301317
if ( !destProvider->create( mOutputFormat, 4, QgsRasterInterface::Byte, iterCols, iterRows, geoTransform,
302-
sourceProvider->crs() ) )
318+
fakeCRS ) )
303319
{
304320
delete destProvider;
305321
return CreateDatasourceError;

‎src/core/raster/qgsrasterfilewriter.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <QString>
99

1010
class QProgressDialog;
11-
class QgsRasterDataProvider;
11+
class QgsRasterIterator;
1212

1313
class CORE_EXPORT QgsRasterFileWriter
1414
{
@@ -25,7 +25,7 @@ class CORE_EXPORT QgsRasterFileWriter
2525
QgsRasterFileWriter( const QString& outputUrl );
2626
~QgsRasterFileWriter();
2727

28-
WriterError writeRaster( QgsRasterDataProvider* sourceProvider, int nCols, QgsRectangle outputExtent = QgsRectangle(), QProgressDialog* p = 0 );
28+
WriterError writeRaster( QgsRasterIterator* iter, int nCols, QgsRectangle outputExtent = QgsRectangle(), QProgressDialog* p = 0 );
2929

3030
void setOutputFormat( const QString& format ) { mOutputFormat = format; }
3131
QString outputFormat() const { return mOutputFormat; }
@@ -46,8 +46,8 @@ class CORE_EXPORT QgsRasterFileWriter
4646

4747
private:
4848
QgsRasterFileWriter(); //forbidden
49-
WriterError writeRasterSingleTile( QgsRasterDataProvider* sourceProvider, int nCols );
50-
WriterError writeARGBRaster( QgsRasterDataProvider* sourceProvider, int nCols, const QgsRectangle& outputExtent );
49+
WriterError writeRasterSingleTile( QgsRasterIterator* iter, int nCols );
50+
WriterError writeARGBRaster( QgsRasterIterator* iter, int nCols, const QgsRectangle& outputExtent );
5151

5252
//initialize vrt member variables
5353
void createVRT( int xSize, int ySize, const QgsCoordinateReferenceSystem& crs, double* geoTransform );

‎src/core/raster/qgsrasteriterator.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,22 @@ QgsRasterIterator::~QgsRasterIterator()
1111
{
1212
}
1313

14-
void QgsRasterIterator::startRasterRead( int bandNumber, QgsRasterViewPort* viewPort, const QgsMapToPixel* mapToPixel )
14+
void QgsRasterIterator::startRasterRead( int bandNumber, int nCols, int nRows, const QgsRectangle& extent )
1515
{
16-
if ( !viewPort || !mapToPixel || !mInput )
16+
if ( !mInput )
1717
{
1818
return;
1919
}
2020

21+
mExtent = extent;
22+
2123
//remove any previous part on that band
2224
removePartInfo( bandNumber );
2325

2426
//split raster into small portions if necessary
2527
RasterPartInfo pInfo;
26-
pInfo.nCols = viewPort->drawableAreaXDim;
27-
pInfo.nRows = viewPort->drawableAreaYDim;
28+
pInfo.nCols = nCols;
29+
pInfo.nRows = nRows;
2830

2931
//effective oversampling factors are different to global one because of rounding
3032
//oversamplingX = (( double )pInfo.nCols * oversampling ) / viewPort->drawableAreaXDim;
@@ -44,16 +46,11 @@ void QgsRasterIterator::startRasterRead( int bandNumber, QgsRasterViewPort* view
4446
mRasterPartInfos.insert( bandNumber, pInfo );
4547
}
4648

47-
bool QgsRasterIterator::readNextRasterPart( int bandNumber, QgsRasterViewPort* viewPort,
49+
bool QgsRasterIterator::readNextRasterPart( int bandNumber,
4850
int& nCols, int& nRows,
4951
void** rasterData,
5052
int& topLeftCol, int& topLeftRow )
5153
{
52-
if ( !viewPort )
53-
{
54-
return false;
55-
}
56-
5754
//get partinfo
5855
QMap<int, RasterPartInfo>::iterator partIt = mRasterPartInfos.find( bandNumber );
5956
if ( partIt == mRasterPartInfos.end() )
@@ -81,7 +78,7 @@ bool QgsRasterIterator::readNextRasterPart( int bandNumber, QgsRasterViewPort* v
8178
nRows = qMin( pInfo.nRowsPerPart, pInfo.nRows - pInfo.currentRow );
8279

8380
//get subrectangle
84-
QgsRectangle viewPortExtent = viewPort->mDrawnExtent;
81+
QgsRectangle viewPortExtent = mExtent;
8582
double xmin = viewPortExtent.xMinimum() + pInfo.currentCol / ( double )pInfo.nCols * viewPortExtent.width();
8683
double xmax = viewPortExtent.xMinimum() + ( pInfo.currentCol + nCols ) / ( double )pInfo.nCols * viewPortExtent.width();
8784
double ymin = viewPortExtent.yMaximum() - ( pInfo.currentRow + nRows ) / ( double )pInfo.nRows * viewPortExtent.height();

‎src/core/raster/qgsrasteriterator.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef QGSRASTERITERATOR_H
22
#define QGSRASTERITERATOR_H
33

4+
#include "qgsrectangle.h"
45
#include <QMap>
56

67
class QgsMapToPixel;
@@ -31,23 +32,26 @@ class QgsRasterIterator
3132
@param bandNumer number of raster band to read
3233
@param viewPort describes raster position on screen
3334
*/
34-
void startRasterRead( int bandNumber, QgsRasterViewPort* viewPort, const QgsMapToPixel* mapToPixel );
35+
void startRasterRead( int bandNumber, int nCols, int nRows, const QgsRectangle& extent );
3536

3637
/**Fetches next part of raster data
3738
@param nCols number of columns on output device
3839
@param nRows number of rows on output device
3940
@param nColsRaster number of raster columns (different to nCols if oversamplingX != 1.0)
4041
@param nRowsRaster number of raster rows (different to nRows if oversamplingY != 0)*/
41-
bool readNextRasterPart( int bandNumber, QgsRasterViewPort* viewPort,
42+
bool readNextRasterPart( int bandNumber,
4243
int& nCols, int& nRows,
4344
void** rasterData,
4445
int& topLeftCol, int& topLeftRow );
4546

4647
void stopRasterRead( int bandNumber );
4748

49+
const QgsRasterInterface* input() const { return mInput; }
50+
4851
private:
4952
QgsRasterInterface* mInput;
5053
QMap<int, RasterPartInfo> mRasterPartInfos;
54+
QgsRectangle mExtent;
5155

5256
/**Remove part into and release memory*/
5357
void removePartInfo( int bandNumber );

0 commit comments

Comments
 (0)
Please sign in to comment.