QGIS API Documentation  3.20.0-Odense (decaadbb31)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgsgridfilewriter.cpp
Go to the documentation of this file.
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 QgsGridFileWriter::QgsGridFileWriter( QgsInterpolator *i, const QString &outputPath, const QgsRectangle &extent, int nCols, int nRows )
26  : mInterpolator( i )
27  , mOutputFilePath( outputPath )
28  , mInterpolationExtent( extent )
29  , mNumColumns( nCols )
30  , mNumRows( nRows )
31  , mCellSizeX( extent.width() / nCols )
32  , mCellSizeY( extent.height() / nRows )
33 {}
34 
36 {
37  QFile outputFile( mOutputFilePath );
38 
39  if ( !outputFile.open( QFile::WriteOnly | QIODevice::Truncate ) )
40  {
41  return 1;
42  }
43 
44  if ( !mInterpolator )
45  {
46  outputFile.remove();
47  return 2;
48  }
49 
50  QTextStream outStream( &outputFile );
51 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
52  outStream.setCodec( "UTF-8" );
53 #endif
54  outStream.setRealNumberPrecision( 8 );
55  writeHeader( outStream );
56 
57  double currentYValue = mInterpolationExtent.yMaximum() - mCellSizeY / 2.0; //calculate value in the center of the cell
58  double currentXValue;
59  double interpolatedValue;
60 
61  for ( int i = 0; i < mNumRows; ++i )
62  {
63  currentXValue = mInterpolationExtent.xMinimum() + mCellSizeX / 2.0; //calculate value in the center of the cell
64  for ( int j = 0; j < mNumColumns; ++j )
65  {
66  if ( mInterpolator->interpolatePoint( currentXValue, currentYValue, interpolatedValue, feedback ) == 0 )
67  {
68  outStream << interpolatedValue << ' ';
69  }
70  else
71  {
72  outStream << "-9999 ";
73  }
74  currentXValue += mCellSizeX;
75  }
76  outStream << endl;
77  currentYValue -= mCellSizeY;
78 
79  if ( feedback )
80  {
81  if ( feedback->isCanceled() )
82  {
83  outputFile.remove();
84  return 3;
85  }
86  feedback->setProgress( 100.0 * i / static_cast< double >( mNumRows ) );
87  }
88  }
89 
90  // create prj file
92  ld = mInterpolator->layerData().at( 0 );
93  QgsFeatureSource *source = ld.source;
94  QString crs = source->sourceCrs().toWkt();
95  QFileInfo fi( mOutputFilePath );
96  QString fileName = fi.absolutePath() + '/' + fi.completeBaseName() + ".prj";
97  QFile prjFile( fileName );
98  if ( !prjFile.open( QFile::WriteOnly | QIODevice::Truncate ) )
99  {
100  return 1;
101  }
102  QTextStream prjStream( &prjFile );
103  prjStream << crs;
104  prjStream << endl;
105  prjFile.close();
106 
107  return 0;
108 }
109 
110 int QgsGridFileWriter::writeHeader( QTextStream &outStream )
111 {
112  outStream << "NCOLS " << mNumColumns << endl;
113  outStream << "NROWS " << mNumRows << endl;
114  outStream << "XLLCORNER " << mInterpolationExtent.xMinimum() << endl;
115  outStream << "YLLCORNER " << mInterpolationExtent.yMinimum() << endl;
116  if ( mCellSizeX == mCellSizeY ) //standard way
117  {
118  outStream << "CELLSIZE " << mCellSizeX << endl;
119  }
120  else //this is supported by GDAL but probably not by other products
121  {
122  outStream << "DX " << mCellSizeX << endl;
123  outStream << "DY " << mCellSizeY << endl;
124  }
125  outStream << "NODATA_VALUE -9999" << endl;
126 
127  return 0;
128 }
QString toWkt(WktVariant variant=WKT1_GDAL, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
An interface for objects which provide features via a getFeatures method.
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition: qgsfeedback.h:45
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition: qgsfeedback.h:63
QgsGridFileWriter(QgsInterpolator *interpolator, const QString &outputPath, const QgsRectangle &extent, int nCols, int nRows)
Constructor for QgsGridFileWriter, for the specified interpolator.
int writeFile(QgsFeedback *feedback=nullptr)
Writes the grid file.
Interface class for interpolations.
virtual int interpolatePoint(double x, double y, double &result, QgsFeedback *feedback=nullptr)=0
Calculates interpolation value for map coordinates x, y.
QList< LayerData > layerData() const
A rectangle specified with double values.
Definition: qgsrectangle.h:42
double yMaximum() const SIP_HOLDGIL
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:193
double xMinimum() const SIP_HOLDGIL
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:188
double yMinimum() const SIP_HOLDGIL
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:198
const QgsCoordinateReferenceSystem & crs
A source together with the information about interpolation attribute / z-coordinate interpolation and...
QgsFeatureSource * source
Feature source.