Quantum GIS API Documentation
1.7.4
|
00001 /*************************************************************************** 00002 qgsgridfilewriter.cpp 00003 --------------------- 00004 begin : Marco 10, 2008 00005 copyright : (C) 2008 by Marco Hugentobler 00006 email : marco dot hugentobler at karto dot baug dot ethz dot ch 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #include "qgsgridfilewriter.h" 00019 #include "qgsinterpolator.h" 00020 #include <QFile> 00021 #include <QProgressDialog> 00022 00023 QgsGridFileWriter::QgsGridFileWriter( QgsInterpolator* i, QString outputPath, QgsRectangle extent, int nCols, int nRows , double cellSizeX, double cellSizeY ): \ 00024 mInterpolator( i ), mOutputFilePath( outputPath ), mInterpolationExtent( extent ), mNumColumns( nCols ), mNumRows( nRows ), mCellSizeX( cellSizeX ), mCellSizeY( cellSizeY ) 00025 { 00026 00027 } 00028 00029 QgsGridFileWriter::QgsGridFileWriter(): mInterpolator( 0 ) 00030 { 00031 00032 } 00033 00034 QgsGridFileWriter::~QgsGridFileWriter() 00035 { 00036 00037 } 00038 00039 int QgsGridFileWriter::writeFile( bool showProgressDialog ) 00040 { 00041 QFile outputFile( mOutputFilePath ); 00042 00043 if ( !outputFile.open( QFile::WriteOnly ) ) 00044 { 00045 return 1; 00046 } 00047 00048 if ( !mInterpolator ) 00049 { 00050 outputFile.remove(); 00051 return 2; 00052 } 00053 00054 QTextStream outStream( &outputFile ); 00055 outStream.setRealNumberPrecision( 8 ); 00056 writeHeader( outStream ); 00057 00058 double currentYValue = mInterpolationExtent.yMaximum() - mCellSizeY / 2.0; //calculate value in the center of the cell 00059 double currentXValue; 00060 double interpolatedValue; 00061 00062 QProgressDialog* progressDialog = 0; 00063 if ( showProgressDialog ) 00064 { 00065 progressDialog = new QProgressDialog( QObject::tr( "Interpolating..." ), QObject::tr( "Abort" ), 0, mNumRows, 0 ); 00066 progressDialog->setWindowModality( Qt::WindowModal ); 00067 } 00068 00069 for ( int i = 0; i < mNumRows; ++i ) 00070 { 00071 currentXValue = mInterpolationExtent.xMinimum() + mCellSizeX / 2.0; //calculate value in the center of the cell 00072 for ( int j = 0; j < mNumColumns; ++j ) 00073 { 00074 if ( mInterpolator->interpolatePoint( currentXValue, currentYValue, interpolatedValue ) == 0 ) 00075 { 00076 outStream << interpolatedValue << " "; 00077 } 00078 else 00079 { 00080 outStream << "-9999 "; 00081 } 00082 currentXValue += mCellSizeX; 00083 } 00084 outStream << endl; 00085 currentYValue -= mCellSizeY; 00086 00087 if ( showProgressDialog ) 00088 { 00089 if ( progressDialog->wasCanceled() ) 00090 { 00091 outputFile.remove(); 00092 return 3; 00093 } 00094 progressDialog->setValue( i ); 00095 } 00096 } 00097 00098 delete progressDialog; 00099 return 0; 00100 } 00101 00102 int QgsGridFileWriter::writeHeader( QTextStream& outStream ) 00103 { 00104 outStream << "NCOLS " << mNumColumns << endl; 00105 outStream << "NROWS " << mNumRows << endl; 00106 outStream << "XLLCORNER " << mInterpolationExtent.xMinimum() << endl; 00107 outStream << "YLLCORNER " << mInterpolationExtent.yMinimum() << endl; 00108 if ( mCellSizeX == mCellSizeY ) //standard way 00109 { 00110 outStream << "CELLSIZE " << mCellSizeX << endl; 00111 } 00112 else //this is supported by GDAL but probably not by other products 00113 { 00114 outStream << "DX " << mCellSizeX << endl; 00115 outStream << "DY " << mCellSizeY << endl; 00116 } 00117 outStream << "NODATA_VALUE -9999" << endl; 00118 00119 return 0; 00120 }