Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'relief'
  • Loading branch information
mhugent committed Jan 12, 2012
2 parents 47ca431 + 878b048 commit 8ed3e6d
Show file tree
Hide file tree
Showing 16 changed files with 1,620 additions and 223 deletions.
2 changes: 2 additions & 0 deletions src/analysis/CMakeLists.txt
Expand Up @@ -26,9 +26,11 @@ SET(QGIS_ANALYSIS_SRCS
raster/qgsninecellfilter.cpp
raster/qgsruggednessfilter.cpp
raster/qgsderivativefilter.cpp
raster/qgshillshadefilter.cpp
raster/qgsslopefilter.cpp
raster/qgsaspectfilter.cpp
raster/qgstotalcurvaturefilter.cpp
raster/qgsrelief.cpp
raster/qgsrastercalcnode.cpp
raster/qgsrastercalculator.cpp
raster/qgsrastermatrix.cpp
Expand Down
3 changes: 1 addition & 2 deletions src/analysis/raster/qgsaspectfilter.h
Expand Up @@ -27,13 +27,12 @@ class ANALYSIS_EXPORT QgsAspectFilter: public QgsDerivativeFilter
QgsAspectFilter( const QString& inputFile, const QString& outputFile, const QString& outputFormat );
~QgsAspectFilter();

protected:
protected:
/**Calculates output value from nine input values. The input values and the output value can be equal to the
nodata value if not present or outside of the border. Must be implemented by subclasses*/
float processNineCellWindow( float* x11, float* x21, float* x31,
float* x12, float* x22, float* x32,
float* x13, float* x23, float* x33 );

};

#endif // QGSASPECTFILTER_H
4 changes: 2 additions & 2 deletions src/analysis/raster/qgsderivativefilter.cpp
Expand Up @@ -92,7 +92,7 @@ float QgsDerivativeFilter::calcFirstDerX( float* x11, float* x21, float* x31, fl
return mOutputNodataValue;
}

return sum / ( weight * mCellSizeX );
return sum / ( weight * mCellSizeX * mZFactor );
}

float QgsDerivativeFilter::calcFirstDerY( float* x11, float* x21, float* x31, float* x12, float* x22, float* x32, float* x13, float* x23, float* x33 )
Expand Down Expand Up @@ -159,7 +159,7 @@ float QgsDerivativeFilter::calcFirstDerY( float* x11, float* x21, float* x31, fl
return mOutputNodataValue;
}

return sum / ( weight * mCellSizeY );
return sum / ( weight * mCellSizeY * mZFactor );
}


Expand Down
54 changes: 54 additions & 0 deletions src/analysis/raster/qgshillshadefilter.cpp
@@ -0,0 +1,54 @@
/***************************************************************************
qgshillshadefilter.h - description
--------------------------------
begin : September 26th, 2011
copyright : (C) 2011 by Marco Hugentobler
email : marco dot hugentobler at sourcepole dot ch
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgshillshadefilter.h"

QgsHillshadeFilter::QgsHillshadeFilter( const QString& inputFile, const QString& outputFile, const QString& outputFormat, double lightAzimuth,
double lightAngle): \
QgsDerivativeFilter( inputFile, outputFile, outputFormat ), mLightAzimuth( lightAzimuth ), mLightAngle( lightAngle )
{
}

QgsHillshadeFilter::~QgsHillshadeFilter()
{
}

float QgsHillshadeFilter::processNineCellWindow( float* x11, float* x21, float* x31, \
float* x12, float* x22, float* x32, float* x13, float* x23, float* x33 )
{
float derX = calcFirstDerX( x11, x21, x31, x12, x22, x32, x13, x23, x33 );
float derY = calcFirstDerY( x11, x21, x31, x12, x22, x32, x13, x23, x33 );

if ( derX == mOutputNodataValue || derY == mOutputNodataValue )
{
return mOutputNodataValue;
}

float zenith_rad = mLightAngle * M_PI / 180.0;
float slope_rad = atan( sqrt( derX * derX + derY * derY ) );
float azimuth_rad = mLightAzimuth * M_PI / 180.0;
float aspect_rad = 0;
if( derX == 0 && derY == 0 ) //aspect undefined, take a neutral value. Better solutions?
{
aspect_rad = azimuth_rad / 2.0;
}
else
{
aspect_rad = M_PI + atan2( derX, derY );
}
return qMax( 0.0, 255.0 * ( ( cos( zenith_rad ) * cos( slope_rad ) ) + ( sin( zenith_rad ) * sin( slope_rad ) * cos( azimuth_rad - aspect_rad ) ) ) );
}
45 changes: 45 additions & 0 deletions src/analysis/raster/qgshillshadefilter.h
@@ -0,0 +1,45 @@
/***************************************************************************
qgshillshadefilter.h - description
--------------------------------
begin : September 26th, 2011
copyright : (C) 2011 by Marco Hugentobler
email : marco dot hugentobler at sourcepole dot ch
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSHILLSHADEFILTER_H
#define QGSHILLSHADEFILTER_H

#include "qgsderivativefilter.h"

class ANALYSIS_EXPORT QgsHillshadeFilter: public QgsDerivativeFilter
{
public:
QgsHillshadeFilter( const QString& inputFile, const QString& outputFile, const QString& outputFormat, double lightAzimuth = 300,
double lightAngle = 40 );
~QgsHillshadeFilter();

/**Calculates output value from nine input values. The input values and the output value can be equal to the \
nodata value if not present or outside of the border. Must be implemented by subclasses*/
float processNineCellWindow( float* x11, float* x21, float* x31, \
float* x12, float* x22, float* x32, float* x13, float* x23, float* x33 );

float lightAzimuth() const { return mLightAzimuth; }
void setLightAzimuth( float azimuth ){ mLightAzimuth = azimuth; }
float lightAngle() const { return mLightAngle; }
void setLightAngle( float angle ){ mLightAngle = angle; }

private:
float mLightAzimuth;
float mLightAngle;
};

#endif // QGSHILLSHADEFILTER_H
3 changes: 2 additions & 1 deletion src/analysis/raster/qgsninecellfilter.cpp
Expand Up @@ -26,7 +26,8 @@
#endif

QgsNineCellFilter::QgsNineCellFilter( const QString& inputFile, const QString& outputFile, const QString& outputFormat )
: mInputFile( inputFile ), mOutputFile( outputFile ), mOutputFormat( outputFormat ), mCellSizeX( -1 ), mCellSizeY( -1 ), mInputNodataValue( -1 ), mOutputNodataValue( -1 )
: mInputFile( inputFile ), mOutputFile( outputFile ), mOutputFormat( outputFormat ), mCellSizeX( -1 ), mCellSizeY( -1 ),
mInputNodataValue( -1 ), mOutputNodataValue( -1 ), mZFactor( 1.0 )
{

}
Expand Down
26 changes: 21 additions & 5 deletions src/analysis/raster/qgsninecellfilter.h
Expand Up @@ -38,6 +38,25 @@ class ANALYSIS_EXPORT QgsNineCellFilter
@return 0 in case of success*/
int processRaster( QProgressDialog* p );

double cellSizeX() const { return mCellSizeX; }
void setCellSizeX( double size ) { mCellSizeX = size; }
double cellSizeY() const { return mCellSizeY; }
void setCellSizeY( double size ) { mCellSizeY = size; }

double zFactor() const { return mZFactor; }
void setZFactor( double factor ) { mZFactor = factor; }

double inputNodataValue() const { return mInputNodataValue; }
void setInputNodataValue( double value ) { mInputNodataValue = value; }
double outputNodataValue() const { return mOutputNodataValue; }
void setOutputNodataValue( double value ) { mOutputNodataValue = value; }

/**Calculates output value from nine input values. The input values and the output value can be equal to the
nodata value if not present or outside of the border. Must be implemented by subclasses*/
virtual float processNineCellWindow( float* x11, float* x21, float* x31,
float* x12, float* x22, float* x32,
float* x13, float* x23, float* x33 ) = 0;

private:
//default constructor forbidden. We need input file, output file and format obligatory
QgsNineCellFilter();
Expand All @@ -52,11 +71,6 @@ class ANALYSIS_EXPORT QgsNineCellFilter
GDALDatasetH openOutputFile( GDALDatasetH inputDataset, GDALDriverH outputDriver );

protected:
/**Calculates output value from nine input values. The input values and the output value can be equal to the
nodata value if not present or outside of the border. Must be implemented by subclasses*/
virtual float processNineCellWindow( float* x11, float* x21, float* x31,
float* x12, float* x22, float* x32,
float* x13, float* x23, float* x33 ) = 0;

QString mInputFile;
QString mOutputFile;
Expand All @@ -68,6 +82,8 @@ class ANALYSIS_EXPORT QgsNineCellFilter
float mInputNodataValue;
/**The nodata value of the output layer*/
float mOutputNodataValue;
/**Scale factor for z-value if x-/y- units are different to z-units (111120 for degree->meters and 370400 for degree->feet)*/
double mZFactor;
};

#endif // QGSNINECELLFILTER_H

0 comments on commit 8ed3e6d

Please sign in to comment.