Skip to content

Commit 47b8d60

Browse files
committedJul 19, 2012
Allow non-square pixels for raster formats with exact resolution
1 parent 2eade8d commit 47b8d60

File tree

3 files changed

+30
-20
lines changed

3 files changed

+30
-20
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3785,8 +3785,18 @@ void QgisApp::saveAsRasterFile()
37853785

37863786
QProgressDialog pd( 0, tr( "Abort..." ), 0, 0 );
37873787
pd.setWindowModality( Qt::WindowModal );
3788-
QgsRasterIterator iterator( rasterLayer->dataProvider() );
3789-
fileWriter.writeRaster( &iterator, d.nColumns(), d.outputRectangle(), rasterLayer->crs(), &pd );
3788+
QgsRasterDataProvider* provider = rasterLayer->dataProvider();
3789+
if ( !provider )
3790+
{
3791+
return;
3792+
}
3793+
QgsRasterIterator iterator( provider );
3794+
int nRows = -1; //calculate number of rows such that pixels are squares
3795+
if ( provider->capabilities() & QgsRasterDataProvider::ExactResolution )
3796+
{
3797+
nRows = d.nRows();
3798+
}
3799+
fileWriter.writeRaster( &iterator, d.nColumns(), nRows, d.outputRectangle(), rasterLayer->crs(), &pd );
37903800
}
37913801
}
37923802

‎src/core/raster/qgsrasterfilewriter.cpp

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ QgsRasterFileWriter::~QgsRasterFileWriter()
2424

2525
}
2626

27-
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIterator* iter, int nCols, QgsRectangle outputExtent,
27+
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIterator* iter, int nCols, int nRows, QgsRectangle outputExtent,
2828
const QgsCoordinateReferenceSystem& crs, QProgressDialog* p )
2929
{
3030
if ( !iter )
@@ -42,19 +42,19 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeRaster( QgsRasterIter
4242

4343
if ( iface->dataType( 1 ) == QgsRasterInterface::ARGB32 )
4444
{
45-
WriterError e = writeImageRaster( iter, nCols, outputExtent, crs );
45+
WriterError e = writeImageRaster( iter, nCols, nRows, outputExtent, crs );
4646
mProgressDialog = 0;
4747
return e;
4848
}
4949
else
5050
{
5151
mProgressDialog = 0;
52-
WriterError e = writeDataRaster( iter, nCols, outputExtent, crs );
52+
WriterError e = writeDataRaster( iter, nCols, nRows, outputExtent, crs );
5353
return e;
5454
}
5555
}
5656

57-
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRasterIterator* iter, int nCols, const QgsRectangle& outputExtent,
57+
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRasterIterator* iter, int nCols, int nRows, const QgsRectangle& outputExtent,
5858
const QgsCoordinateReferenceSystem& crs )
5959
{
6060
if ( !iter )
@@ -76,7 +76,6 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster
7676
}
7777

7878
//Get output map units per pixel
79-
double outputMapUnitsPerPixel = outputExtent.width() / nCols;
8079
int iterLeft, iterTop, iterCols, iterRows;
8180

8281
iter->setMaximumTileWidth( mMaxTileWidth );
@@ -90,7 +89,6 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster
9089

9190
//create destProvider for whole dataset here
9291
QgsRasterDataProvider* destProvider = 0;
93-
int nRows;
9492
double pixelSize;
9593
double geoTransform[6];
9694
globalOutputParameters( outputExtent, nCols, nRows, geoTransform, pixelSize );
@@ -160,7 +158,7 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeDataRaster( QgsRaster
160158
}
161159
}
162160

163-
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRasterIterator* iter, int nCols, const QgsRectangle& outputExtent,
161+
QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRasterIterator* iter, int nCols, int nRows, const QgsRectangle& outputExtent,
164162
const QgsCoordinateReferenceSystem& crs )
165163
{
166164
if ( !iter )
@@ -181,10 +179,6 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRaste
181179
destDir.mkdir( mOutputUrl );
182180
}
183181

184-
//Get output map units per pixel
185-
double outputMapUnitsPerPixel = outputExtent.width() / nCols;
186-
187-
188182
iter->setMaximumTileWidth( mMaxTileWidth );
189183
iter->setMaximumTileHeight( mMaxTileHeight );
190184

@@ -195,12 +189,10 @@ QgsRasterFileWriter::WriterError QgsRasterFileWriter::writeImageRaster( QgsRaste
195189
void* alphaData = VSIMalloc( mMaxTileWidth * mMaxTileHeight );
196190
QgsRectangle mapRect;
197191
int iterLeft, iterTop, iterCols, iterRows;
198-
double progress = 0;
199192
int fileIndex = 0;
200193

201194
//create destProvider for whole dataset here
202195
QgsRasterDataProvider* destProvider = 0;
203-
int nRows;
204196
double pixelSize;
205197
double geoTransform[6];
206198
globalOutputParameters( outputExtent, nCols, nRows, geoTransform, pixelSize );
@@ -531,13 +523,18 @@ void QgsRasterFileWriter::globalOutputParameters( const QgsRectangle& extent, in
531523
double* geoTransform, double& pixelSize )
532524
{
533525
pixelSize = extent.width() / nCols;
534-
nRows = ( double )nCols / extent.width() * extent.height() + 0.5;
526+
527+
//calculate nRows automatically for providers without exact resolution
528+
if ( nRows < 0 )
529+
{
530+
nRows = ( double )nCols / extent.width() * extent.height() + 0.5;
531+
}
535532
geoTransform[0] = extent.xMinimum();
536533
geoTransform[1] = pixelSize;
537534
geoTransform[2] = 0.0;
538535
geoTransform[3] = extent.yMaximum();
539536
geoTransform[4] = 0.0;
540-
geoTransform[5] = -pixelSize;
537+
geoTransform[5] = -( extent.height() / nRows );
541538
}
542539

543540

‎src/core/raster/qgsrasterfilewriter.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ class CORE_EXPORT QgsRasterFileWriter
2626
QgsRasterFileWriter( const QString& outputUrl );
2727
~QgsRasterFileWriter();
2828

29-
WriterError writeRaster( QgsRasterIterator* iter, int nCols, QgsRectangle outputExtent,
29+
/**Write raster file
30+
@param nCols number of output columns
31+
@param nRows number of output rows (or -1 to automatically calculate row number to have square pixels)*/
32+
WriterError writeRaster( QgsRasterIterator* iter, int nCols, int nRows, QgsRectangle outputExtent,
3033
const QgsCoordinateReferenceSystem& crs, QProgressDialog* p = 0 );
3134

3235
void setOutputFormat( const QString& format ) { mOutputFormat = format; }
@@ -46,9 +49,9 @@ class CORE_EXPORT QgsRasterFileWriter
4649

4750
private:
4851
QgsRasterFileWriter(); //forbidden
49-
WriterError writeDataRaster( QgsRasterIterator* iter, int nCols, const QgsRectangle& outputExtent,
52+
WriterError writeDataRaster( QgsRasterIterator* iter, int nCols, int nRows, const QgsRectangle& outputExtent,
5053
const QgsCoordinateReferenceSystem& crs );
51-
WriterError writeImageRaster( QgsRasterIterator* iter, int nCols, const QgsRectangle& outputExtent,
54+
WriterError writeImageRaster( QgsRasterIterator* iter, int nCols, int nRows, const QgsRectangle& outputExtent,
5255
const QgsCoordinateReferenceSystem& crs );
5356

5457
//initialize vrt member variables

0 commit comments

Comments
 (0)
Please sign in to comment.