Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsgridfilewriter.cpp 3 : : --------------------- 4 : : begin : Marco 10, 2008 5 : : copyright : (C) 2008 by Marco Hugentobler 6 : : email : marco dot hugentobler at karto dot baug dot ethz dot ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsgridfilewriter.h" 19 : : #include "qgsinterpolator.h" 20 : : #include "qgsvectorlayer.h" 21 : : #include "qgsfeedback.h" 22 : : #include <QFile> 23 : : #include <QFileInfo> 24 : : 25 : 0 : QgsGridFileWriter::QgsGridFileWriter( QgsInterpolator *i, const QString &outputPath, const QgsRectangle &extent, int nCols, int nRows ) 26 : 0 : : mInterpolator( i ) 27 : 0 : , mOutputFilePath( outputPath ) 28 : 0 : , mInterpolationExtent( extent ) 29 : 0 : , mNumColumns( nCols ) 30 : 0 : , mNumRows( nRows ) 31 : 0 : , mCellSizeX( extent.width() / nCols ) 32 : 0 : , mCellSizeY( extent.height() / nRows ) 33 : 0 : {} 34 : : 35 : 0 : int QgsGridFileWriter::writeFile( QgsFeedback *feedback ) 36 : : { 37 : 0 : QFile outputFile( mOutputFilePath ); 38 : : 39 : 0 : if ( !outputFile.open( QFile::WriteOnly | QIODevice::Truncate ) ) 40 : : { 41 : 0 : return 1; 42 : : } 43 : : 44 : 0 : if ( !mInterpolator ) 45 : : { 46 : 0 : outputFile.remove(); 47 : 0 : return 2; 48 : : } 49 : : 50 : 0 : QTextStream outStream( &outputFile ); 51 : 0 : outStream.setRealNumberPrecision( 8 ); 52 : 0 : writeHeader( outStream ); 53 : : 54 : 0 : double currentYValue = mInterpolationExtent.yMaximum() - mCellSizeY / 2.0; //calculate value in the center of the cell 55 : : double currentXValue; 56 : : double interpolatedValue; 57 : : 58 : 0 : for ( int i = 0; i < mNumRows; ++i ) 59 : : { 60 : 0 : currentXValue = mInterpolationExtent.xMinimum() + mCellSizeX / 2.0; //calculate value in the center of the cell 61 : 0 : for ( int j = 0; j < mNumColumns; ++j ) 62 : : { 63 : 0 : if ( mInterpolator->interpolatePoint( currentXValue, currentYValue, interpolatedValue, feedback ) == 0 ) 64 : : { 65 : 0 : outStream << interpolatedValue << ' '; 66 : 0 : } 67 : : else 68 : : { 69 : 0 : outStream << "-9999 "; 70 : : } 71 : 0 : currentXValue += mCellSizeX; 72 : 0 : } 73 : 0 : outStream << endl; 74 : 0 : currentYValue -= mCellSizeY; 75 : : 76 : 0 : if ( feedback ) 77 : : { 78 : 0 : if ( feedback->isCanceled() ) 79 : : { 80 : 0 : outputFile.remove(); 81 : 0 : return 3; 82 : : } 83 : 0 : feedback->setProgress( 100.0 * i / static_cast< double >( mNumRows ) ); 84 : 0 : } 85 : 0 : } 86 : : 87 : : // create prj file 88 : 0 : QgsInterpolator::LayerData ld; 89 : 0 : ld = mInterpolator->layerData().at( 0 ); 90 : 0 : QgsFeatureSource *source = ld.source; 91 : 0 : QString crs = source->sourceCrs().toWkt(); 92 : 0 : QFileInfo fi( mOutputFilePath ); 93 : 0 : QString fileName = fi.absolutePath() + '/' + fi.completeBaseName() + ".prj"; 94 : 0 : QFile prjFile( fileName ); 95 : 0 : if ( !prjFile.open( QFile::WriteOnly | QIODevice::Truncate ) ) 96 : : { 97 : 0 : return 1; 98 : : } 99 : 0 : QTextStream prjStream( &prjFile ); 100 : 0 : prjStream << crs; 101 : 0 : prjStream << endl; 102 : 0 : prjFile.close(); 103 : : 104 : 0 : return 0; 105 : 0 : } 106 : : 107 : 0 : int QgsGridFileWriter::writeHeader( QTextStream &outStream ) 108 : : { 109 : 0 : outStream << "NCOLS " << mNumColumns << endl; 110 : 0 : outStream << "NROWS " << mNumRows << endl; 111 : 0 : outStream << "XLLCORNER " << mInterpolationExtent.xMinimum() << endl; 112 : 0 : outStream << "YLLCORNER " << mInterpolationExtent.yMinimum() << endl; 113 : 0 : if ( mCellSizeX == mCellSizeY ) //standard way 114 : : { 115 : 0 : outStream << "CELLSIZE " << mCellSizeX << endl; 116 : 0 : } 117 : : else //this is supported by GDAL but probably not by other products 118 : : { 119 : 0 : outStream << "DX " << mCellSizeX << endl; 120 : 0 : outStream << "DY " << mCellSizeY << endl; 121 : : } 122 : 0 : outStream << "NODATA_VALUE -9999" << endl; 123 : : 124 : 0 : return 0; 125 : : }