Skip to content

Commit 42bedc4

Browse files
gui2devnyalldawson
authored andcommittedMay 11, 2018
Update qgsrasterfilewriter.cpp
Bad geo-referencing bug fix Using VRT with large coordinate system (like RGF93/CCxx) and high resolution raster, highest resolution tiles were shifted regardingi original raster. It seemed that when creating the VRT file, georeferencing is truncated while converted to text, leading to loss of precision.
1 parent d36d4f8 commit 42bedc4

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed
 

‎src/core/raster/qgsrasterfilewriter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -815,8 +815,8 @@ void QgsRasterFileWriter::createVRT( int xSize, int ySize, const QgsCoordinateRe
815815
if ( geoTransform )
816816
{
817817
QDomElement geoTransformElem = mVRTDocument.createElement( QStringLiteral( "GeoTransform" ) );
818-
QString geoTransformString = QString::number( geoTransform[0] ) + ", " + QString::number( geoTransform[1] ) + ", " + QString::number( geoTransform[2] ) +
819-
", " + QString::number( geoTransform[3] ) + ", " + QString::number( geoTransform[4] ) + ", " + QString::number( geoTransform[5] );
818+
QString geoTransformString = QString::number( geoTransform[0], 'f', 6 ) + ", " + QString::number( geoTransform[1] ) + ", " + QString::number( geoTransform[2] ) +
819+
", " + QString::number( geoTransform[3], 'f', 6 ) + ", " + QString::number( geoTransform[4] ) + ", " + QString::number( geoTransform[5] );
820820
QDomText geoTransformText = mVRTDocument.createTextNode( geoTransformString );
821821
geoTransformElem.appendChild( geoTransformText );
822822
VRTDatasetElem.appendChild( geoTransformElem );

‎tests/src/core/testqgsrasterfilewriter.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class TestQgsRasterFileWriter: public QObject
5050
void writeTest();
5151
void testCreateOneBandRaster();
5252
void testCreateMultiBandRaster();
53+
void testVrtCreation();
5354
private:
5455
bool writeTest( const QString &rasterName );
5556
void log( const QString &msg );
@@ -271,6 +272,52 @@ void TestQgsRasterFileWriter::testCreateMultiBandRaster()
271272
delete rlayer;
272273
}
273274

275+
void TestQgsRasterFileWriter::testVrtCreation()
276+
{
277+
//create a raster layer that will be used in all tests...
278+
QString srcFileName = mTestDataDir + QStringLiteral( "ALLINGES_RGF93_CC46_1_1.tif" );
279+
QFileInfo rasterFileInfo( srcFileName );
280+
std::unique_ptr< QgsRasterLayer > srcRasterLayer = qgis::make_unique< QgsRasterLayer >( rasterFileInfo.absoluteFilePath(), rasterFileInfo.completeBaseName() );
281+
282+
QTemporaryDir dir;
283+
std::unique_ptr< QgsRasterFileWriter > rasterFileWriter = qgis::make_unique< QgsRasterFileWriter >( dir.path() + '/' + rasterFileInfo.completeBaseName() );
284+
285+
//2. Definition of the pyramid levels
286+
QList<int> levelList;
287+
levelList << 2 << 4 << 8 << 16 << 32 << 64 << 128;
288+
rasterFileWriter->setPyramidsList( levelList );
289+
//3. Pyramid format
290+
rasterFileWriter->setPyramidsFormat( QgsRaster::PyramidsGTiff );
291+
//4. Resampling method
292+
rasterFileWriter->setPyramidsResampling( QStringLiteral( "NEAREST" ) );
293+
//5. Tiled mode => true for vrt creation
294+
rasterFileWriter->setTiledMode( true );
295+
//6. Tile size
296+
rasterFileWriter->setMaxTileWidth( 500 );
297+
rasterFileWriter->setMaxTileHeight( 500 );
298+
//7. Coordinate Reference System
299+
QgsCoordinateReferenceSystem crs;
300+
crs.createFromString( "EPSG:3946" );
301+
//8. Prepare raster pipe
302+
QgsRasterPipe pipe;
303+
pipe.set( srcRasterLayer->dataProvider()->clone() );
304+
// Let's do it !
305+
QgsRasterFileWriter::WriterError res = rasterFileWriter->writeRaster( &pipe, srcRasterLayer->width(), srcRasterLayer->height(), srcRasterLayer->extent(), crs );
306+
QCOMPARE( res, QgsRasterFileWriter::NoError );
307+
308+
// Now let's compare the georef of the original raster with the georef of the generated vrt file
309+
std::unique_ptr< QgsRasterLayer > vrtRasterLayer = qgis::make_unique< QgsRasterLayer >( dir.path() + '/' + rasterFileInfo.completeBaseName() + '/' + rasterFileInfo.completeBaseName() + QStringLiteral( ".vrt" ), rasterFileInfo.completeBaseName() );
310+
311+
double xminVrt = vrtRasterLayer->extent().xMinimum();
312+
double yminVrt = vrtRasterLayer->extent().yMaximum();
313+
double xminOriginal = srcRasterLayer->extent().xMinimum();
314+
double yminOriginal = srcRasterLayer->extent().yMaximum();
315+
316+
// Let's check if the georef of the original raster with the georef of the generated vrt file
317+
QGSCOMPARENEAR( xminVrt, xminOriginal, srcRasterLayer->rasterUnitsPerPixelX() / 4 );
318+
QGSCOMPARENEAR( yminVrt, yminOriginal, srcRasterLayer->rasterUnitsPerPixelY() / 4 );
319+
}
320+
274321
void TestQgsRasterFileWriter::log( const QString &msg )
275322
{
276323
mReport += msg + "<br>";
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
0.020000000000
2+
0
3+
0
4+
-0.020000000000
5+
1964499.715750000207
6+
5242972.348840000108
115 KB
Binary file not shown.

0 commit comments

Comments
 (0)
Please sign in to comment.