Skip to content

Commit

Permalink
[processing] add area to raster layer unique values report algorithm (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Oct 10, 2017
1 parent 8759e7c commit 61dcba4
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 67 deletions.

This file was deleted.

@@ -0,0 +1,29 @@
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/></head><body>
<p>Analyzed file: /home/webmaster/dev/cpp/QGIS/python/plugins/processing/tests/testdata/raster.tif (band 1)</p>
<p>Extent: 270736.0673250681720674,4458888.9563983473926783 : 270899.8544675338780507,4459029.5745217483490705</p>
<p>Projection: ED50 / UTM zone 30N (EPSG:23030)</p>
<p>Width in pixels: 16 (units per pixel 10.2367)</p>
<p>Height in pixels: 14 (units per pixel 10.0442)</p>
<p>Total pixel count: 224</p>
<p>NODATA pixel count: 104</p>
<table><tr><td>Value</td><td>Pixel count</td><td>Area (m²)</td></tr>
<tr><td>826</td><td>4</td><td>411.2757251916548</td></tr>
<tr><td>837</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>843</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>845</td><td>4</td><td>411.2757251916548</td></tr>
<tr><td>851</td><td>9</td><td>925.3703816812233</td></tr>
<tr><td>853</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>859</td><td>10</td><td>1028.189312979137</td></tr>
<tr><td>861</td><td>4</td><td>411.2757251916548</td></tr>
<tr><td>864</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>866</td><td>9</td><td>925.3703816812233</td></tr>
<tr><td>868</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>872</td><td>4</td><td>411.2757251916548</td></tr>
<tr><td>873</td><td>9</td><td>925.3703816812233</td></tr>
<tr><td>878</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>880</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>881</td><td>6</td><td>616.9135877874822</td></tr>
<tr><td>890</td><td>13</td><td>1336.646106872878</td></tr>
<tr><td>899</td><td>6</td><td>616.9135877874822</td></tr>
</table>
</body></html>
44 changes: 22 additions & 22 deletions python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml
Expand Up @@ -3236,8 +3236,8 @@ tests:
- 'Standard deviation: 43.9618116337985'
- 'Sum of the squares: 252304334.52061242'

- algorithm: qgis:rasterlayeruniquevaluescount
name: Raster layer unique values count
- algorithm: qgis:rasterlayeruniquevaluesreport
name: Raster layer unique values report
params:
INPUT:
name: raster.tif
Expand All @@ -3248,26 +3248,26 @@ tests:
name: raster_unique_values_count.html
type: regex
rules:
- 'Total cell count: 224'
- 'NODATA count: 104'
- '826</td><td>4</td>'
- '837</td><td>6</td>'
- '843</td><td>6</td>'
- '845</td><td>4</td>'
- '851</td><td>9</td>'
- '853</td><td>6</td>'
- '859</td><td>10</td>'
- '861</td><td>4</td>'
- '864</td><td>6</td>'
- '866</td><td>9</td>'
- '868</td><td>6</td>'
- '872</td><td>4</td>'
- '873</td><td>9</td>'
- '878</td><td>6</td>'
- '880</td><td>6</td>'
- '881</td><td>6</td>'
- '890</td><td>13</td>'
- '899</td><td>6</td>'
- 'Total pixel count: 224'
- 'NODATA pixel count: 104'
- '826</td><td>4</td><td>411.2757251916548'
- '837</td><td>6</td><td>616.9135877874822'
- '843</td><td>6</td><td>616.9135877874822'
- '845</td><td>4</td><td>411.2757251916548'
- '851</td><td>9</td><td>925.3703816812233'
- '853</td><td>6</td><td>616.9135877874822'
- '859</td><td>10</td><td>1028.189312979137'
- '861</td><td>4</td><td>411.2757251916548'
- '864</td><td>6</td><td>616.9135877874822'
- '866</td><td>9</td><td>925.3703816812233'
- '868</td><td>6</td><td>616.9135877874822'
- '872</td><td>4</td><td>411.2757251916548'
- '873</td><td>9</td><td>925.3703816812233'
- '878</td><td>6</td><td>616.9135877874822'
- '880</td><td>6</td><td>616.9135877874822'
- '881</td><td>6</td><td>616.9135877874822'
- '890</td><td>13</td><td>1336.646106872878'
- '899</td><td>6</td><td>616.9135877874822'

- algorithm: qgis:pointsdisplacement
name: Point displacement
Expand Down
51 changes: 37 additions & 14 deletions src/core/processing/qgsnativealgorithms.cpp
Expand Up @@ -89,7 +89,7 @@ void QgsNativeAlgorithms::loadAlgorithms()
addAlgorithm( new QgsLineIntersectionAlgorithm() );
addAlgorithm( new QgsSplitWithLinesAlgorithm() );
addAlgorithm( new QgsMeanCoordinatesAlgorithm() );
addAlgorithm( new QgsRasterLayerUniqueValuesCountAlgorithm() );
addAlgorithm( new QgsRasterLayerUniqueValuesReportAlgorithm() );
}

void QgsSaveSelectedFeatures::initAlgorithm( const QVariantMap & )
Expand Down Expand Up @@ -2589,28 +2589,36 @@ QVariantMap QgsMeanCoordinatesAlgorithm::processAlgorithm( const QVariantMap &pa
}


void QgsRasterLayerUniqueValuesCountAlgorithm::initAlgorithm( const QVariantMap & )
void QgsRasterLayerUniqueValuesReportAlgorithm::initAlgorithm( const QVariantMap & )
{
addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "INPUT" ),
QObject::tr( "Input layer" ) ) );
addParameter( new QgsProcessingParameterBand( QStringLiteral( "BAND" ),
QObject::tr( "Band number" ), 1, QStringLiteral( "INPUT" ) ) );
addParameter( new QgsProcessingParameterFileDestination( QStringLiteral( "OUTPUT_HTML_FILE" ),
QObject::tr( "Unique values count" ), QObject::tr( "HTML files (*.html)" ), QVariant(), true ) );
addOutput( new QgsProcessingOutputHtml( QStringLiteral( "OUTPUT_HTML_FILE" ), QObject::tr( "Unique values count" ) ) );
QObject::tr( "Unique values report" ), QObject::tr( "HTML files (*.html)" ), QVariant(), true ) );

addOutput( new QgsProcessingOutputHtml( QStringLiteral( "OUTPUT_HTML_FILE" ), QObject::tr( "Unique values report" ) ) );

addOutput( new QgsProcessingOutputString( QStringLiteral( "EXTENT" ), QObject::tr( "Extent" ) ) );
addOutput( new QgsProcessingOutputString( QStringLiteral( "CRS_AUTHID" ), QObject::tr( "CRS authority identifier" ) ) );
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "WIDTH_IN_PIXELS" ), QObject::tr( "Width in pixels" ) ) );
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "HEIGHT_IN_PIXELS" ), QObject::tr( "Height in pixels" ) ) );
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "TOTAL_PIXEL_COUNT" ), QObject::tr( "Total pixel count" ) ) );
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "NODATA_PIXEL_COUNT" ), QObject::tr( "NODATA pixel count" ) ) );
}

QString QgsRasterLayerUniqueValuesCountAlgorithm::shortHelpString() const
QString QgsRasterLayerUniqueValuesReportAlgorithm::shortHelpString() const
{
return QObject::tr( "This algorithm returns the count of each unique value in a given raster layer." );
return QObject::tr( "This algorithm returns the count and area of each unique value in a given raster layer." );
}

QgsRasterLayerUniqueValuesCountAlgorithm *QgsRasterLayerUniqueValuesCountAlgorithm::createInstance() const
QgsRasterLayerUniqueValuesReportAlgorithm *QgsRasterLayerUniqueValuesReportAlgorithm::createInstance() const
{
return new QgsRasterLayerUniqueValuesCountAlgorithm();
return new QgsRasterLayerUniqueValuesReportAlgorithm();
}

QVariantMap QgsRasterLayerUniqueValuesCountAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
QVariantMap QgsRasterLayerUniqueValuesReportAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
{
QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT" ), context );
int band = parameterAsInt( parameters, QStringLiteral( "BAND" ), context );
Expand Down Expand Up @@ -2652,22 +2660,37 @@ QVariantMap QgsRasterLayerUniqueValuesCountAlgorithm::processAlgorithm( const QV
}

QVariantMap outputs;
outputs.insert( QStringLiteral( "EXTENT" ), layer->extent().toString() );
outputs.insert( QStringLiteral( "CRS_AUTHID" ), layer->crs().authid() );
outputs.insert( QStringLiteral( "WIDTH_IN_PIXELS" ), width );
outputs.insert( QStringLiteral( "HEIGHT_IN_PIXELS" ), height );
outputs.insert( QStringLiteral( "TOTAL_PIXEL_COUNT" ), width * height );
outputs.insert( QStringLiteral( "NODATA_PIXEL_COUNT" ), noDataCount );

if ( !outputFile.isEmpty() )
{
QFile file( outputFile );
if ( file.open( QIODevice::WriteOnly | QIODevice::Text ) )
{
QString areaUnit = QgsUnitTypes::toAbbreviatedString( QgsUnitTypes::distanceToAreaUnit( layer->crs().mapUnits() ) );
double cellArea = layer->rasterUnitsPerPixelX() * layer->rasterUnitsPerPixelY();

QTextStream out( &file );
out << QString( "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/></head><body>\n" );
out << QObject::tr( "<p>Analyzed file: %1 (band %2)</p>\n" ).arg( layer->source() ).arg( band );
out << QObject::tr( "<p>Total cell count: %1</p>\n" ).arg( width * height );
out << QString( "<p>%1: %2 (%3 %4)</p>\n" ).arg( QObject::tr( "Analyzed file" ) ).arg( layer->source() ).arg( QObject::tr( "band" ) ).arg( band );
out << QObject::tr( "<p>%1: %2</p>\n" ).arg( QObject::tr( "Extent" ) ).arg( layer->extent().toString() );
out << QObject::tr( "<p>%1: %2 (%3)</p>\n" ).arg( QObject::tr( "Projection" ) ).arg( layer->crs().description() ).arg( layer->crs().authid() );
out << QObject::tr( "<p>%1: %2 (%3 %4)</p>\n" ).arg( QObject::tr( "Width in pixels" ) ).arg( width ).arg( QObject::tr( "units per pixel" ) ).arg( layer->rasterUnitsPerPixelX() );
out << QObject::tr( "<p>%1: %2 (%3 %4)</p>\n" ).arg( QObject::tr( "Height in pixels" ) ).arg( height ).arg( QObject::tr( "units per pixel" ) ).arg( layer->rasterUnitsPerPixelY() );
out << QObject::tr( "<p>%1: %2</p>\n" ).arg( QObject::tr( "Total pixel count" ) ).arg( width * height );
if ( noDataCount > -1 )
out << QObject::tr( "<p>NODATA count: %1</p>\n" ).arg( noDataCount );
out << QString( "<table><tr><td>%1</td><td>%2</td></tr>\n" ).arg( QObject::tr( "Value" ) ).arg( QObject::tr( "Count" ) );
out << QObject::tr( "<p>%1: %2</p>\n" ).arg( QObject::tr( "NODATA pixel count" ) ).arg( noDataCount );
out << QString( "<table><tr><td>%1</td><td>%2</td><td>%3 (%4)</td></tr>\n" ).arg( QObject::tr( "Value" ) ).arg( QObject::tr( "Pixel count" ) ).arg( QObject::tr( "Area" ) ).arg( areaUnit );

for ( double key : sortedUniqueValues.keys() )
{
out << QString( "<tr><td>%1</td><td>%2</td></tr>\n" ).arg( key ).arg( sortedUniqueValues[key] );
double area = sortedUniqueValues[key] * cellArea;
out << QString( "<tr><td>%1</td><td>%2</td><td>%3</td></tr>\n" ).arg( key ).arg( sortedUniqueValues[key] ).arg( QString::number( area, 'g', 16 ) );
}
out << QString( "</table>\n</body></html>" );
outputs.insert( QStringLiteral( "OUTPUT_HTML_FILE" ), outputFile );
Expand Down
13 changes: 7 additions & 6 deletions src/core/processing/qgsnativealgorithms.h
Expand Up @@ -811,20 +811,21 @@ class QgsMeanCoordinatesAlgorithm : public QgsProcessingAlgorithm
};

/**
* Native raster layer unique values count algorithm.
* Native raster layer unique values report algorithm.
*/
class QgsRasterLayerUniqueValuesCountAlgorithm : public QgsProcessingAlgorithm
class QgsRasterLayerUniqueValuesReportAlgorithm : public QgsProcessingAlgorithm
{

public:

QgsRasterLayerUniqueValuesCountAlgorithm() = default;
QgsRasterLayerUniqueValuesReportAlgorithm() = default;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
QString name() const override { return QStringLiteral( "rasterlayeruniquevaluescount" ); }
QString displayName() const override { return QObject::tr( "Raster layer unique values count" ); }
QString name() const override { return QStringLiteral( "rasterlayeruniquevaluesreport" ); }
QString displayName() const override { return QObject::tr( "Raster layer unique values report" ); }
virtual QStringList tags() const override { return QObject::tr( "count,area,statistics" ).split( ',' ); }
QString group() const override { return QObject::tr( "Raster analysis" ); }
QString shortHelpString() const override;
QgsRasterLayerUniqueValuesCountAlgorithm *createInstance() const override SIP_FACTORY;
QgsRasterLayerUniqueValuesReportAlgorithm *createInstance() const override SIP_FACTORY;

protected:

Expand Down

0 comments on commit 61dcba4

Please sign in to comment.