Skip to content

Commit 61dcba4

Browse files
authoredOct 10, 2017
[processing] add area to raster layer unique values report algorithm (#5334)
1 parent 8759e7c commit 61dcba4

File tree

5 files changed

+95
-67
lines changed

5 files changed

+95
-67
lines changed
 

‎python/plugins/processing/tests/testdata/expected/raster_unique_values_count.html

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/></head><body>
2+
<p>Analyzed file: /home/webmaster/dev/cpp/QGIS/python/plugins/processing/tests/testdata/raster.tif (band 1)</p>
3+
<p>Extent: 270736.0673250681720674,4458888.9563983473926783 : 270899.8544675338780507,4459029.5745217483490705</p>
4+
<p>Projection: ED50 / UTM zone 30N (EPSG:23030)</p>
5+
<p>Width in pixels: 16 (units per pixel 10.2367)</p>
6+
<p>Height in pixels: 14 (units per pixel 10.0442)</p>
7+
<p>Total pixel count: 224</p>
8+
<p>NODATA pixel count: 104</p>
9+
<table><tr><td>Value</td><td>Pixel count</td><td>Area (m²)</td></tr>
10+
<tr><td>826</td><td>4</td><td>411.2757251916548</td></tr>
11+
<tr><td>837</td><td>6</td><td>616.9135877874822</td></tr>
12+
<tr><td>843</td><td>6</td><td>616.9135877874822</td></tr>
13+
<tr><td>845</td><td>4</td><td>411.2757251916548</td></tr>
14+
<tr><td>851</td><td>9</td><td>925.3703816812233</td></tr>
15+
<tr><td>853</td><td>6</td><td>616.9135877874822</td></tr>
16+
<tr><td>859</td><td>10</td><td>1028.189312979137</td></tr>
17+
<tr><td>861</td><td>4</td><td>411.2757251916548</td></tr>
18+
<tr><td>864</td><td>6</td><td>616.9135877874822</td></tr>
19+
<tr><td>866</td><td>9</td><td>925.3703816812233</td></tr>
20+
<tr><td>868</td><td>6</td><td>616.9135877874822</td></tr>
21+
<tr><td>872</td><td>4</td><td>411.2757251916548</td></tr>
22+
<tr><td>873</td><td>9</td><td>925.3703816812233</td></tr>
23+
<tr><td>878</td><td>6</td><td>616.9135877874822</td></tr>
24+
<tr><td>880</td><td>6</td><td>616.9135877874822</td></tr>
25+
<tr><td>881</td><td>6</td><td>616.9135877874822</td></tr>
26+
<tr><td>890</td><td>13</td><td>1336.646106872878</td></tr>
27+
<tr><td>899</td><td>6</td><td>616.9135877874822</td></tr>
28+
</table>
29+
</body></html>

‎python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3236,8 +3236,8 @@ tests:
32363236
- 'Standard deviation: 43.9618116337985'
32373237
- 'Sum of the squares: 252304334.52061242'
32383238

3239-
- algorithm: qgis:rasterlayeruniquevaluescount
3240-
name: Raster layer unique values count
3239+
- algorithm: qgis:rasterlayeruniquevaluesreport
3240+
name: Raster layer unique values report
32413241
params:
32423242
INPUT:
32433243
name: raster.tif
@@ -3248,26 +3248,26 @@ tests:
32483248
name: raster_unique_values_count.html
32493249
type: regex
32503250
rules:
3251-
- 'Total cell count: 224'
3252-
- 'NODATA count: 104'
3253-
- '826</td><td>4</td>'
3254-
- '837</td><td>6</td>'
3255-
- '843</td><td>6</td>'
3256-
- '845</td><td>4</td>'
3257-
- '851</td><td>9</td>'
3258-
- '853</td><td>6</td>'
3259-
- '859</td><td>10</td>'
3260-
- '861</td><td>4</td>'
3261-
- '864</td><td>6</td>'
3262-
- '866</td><td>9</td>'
3263-
- '868</td><td>6</td>'
3264-
- '872</td><td>4</td>'
3265-
- '873</td><td>9</td>'
3266-
- '878</td><td>6</td>'
3267-
- '880</td><td>6</td>'
3268-
- '881</td><td>6</td>'
3269-
- '890</td><td>13</td>'
3270-
- '899</td><td>6</td>'
3251+
- 'Total pixel count: 224'
3252+
- 'NODATA pixel count: 104'
3253+
- '826</td><td>4</td><td>411.2757251916548'
3254+
- '837</td><td>6</td><td>616.9135877874822'
3255+
- '843</td><td>6</td><td>616.9135877874822'
3256+
- '845</td><td>4</td><td>411.2757251916548'
3257+
- '851</td><td>9</td><td>925.3703816812233'
3258+
- '853</td><td>6</td><td>616.9135877874822'
3259+
- '859</td><td>10</td><td>1028.189312979137'
3260+
- '861</td><td>4</td><td>411.2757251916548'
3261+
- '864</td><td>6</td><td>616.9135877874822'
3262+
- '866</td><td>9</td><td>925.3703816812233'
3263+
- '868</td><td>6</td><td>616.9135877874822'
3264+
- '872</td><td>4</td><td>411.2757251916548'
3265+
- '873</td><td>9</td><td>925.3703816812233'
3266+
- '878</td><td>6</td><td>616.9135877874822'
3267+
- '880</td><td>6</td><td>616.9135877874822'
3268+
- '881</td><td>6</td><td>616.9135877874822'
3269+
- '890</td><td>13</td><td>1336.646106872878'
3270+
- '899</td><td>6</td><td>616.9135877874822'
32713271

32723272
- algorithm: qgis:pointsdisplacement
32733273
name: Point displacement

‎src/core/processing/qgsnativealgorithms.cpp

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void QgsNativeAlgorithms::loadAlgorithms()
8989
addAlgorithm( new QgsLineIntersectionAlgorithm() );
9090
addAlgorithm( new QgsSplitWithLinesAlgorithm() );
9191
addAlgorithm( new QgsMeanCoordinatesAlgorithm() );
92-
addAlgorithm( new QgsRasterLayerUniqueValuesCountAlgorithm() );
92+
addAlgorithm( new QgsRasterLayerUniqueValuesReportAlgorithm() );
9393
}
9494

9595
void QgsSaveSelectedFeatures::initAlgorithm( const QVariantMap & )
@@ -2589,28 +2589,36 @@ QVariantMap QgsMeanCoordinatesAlgorithm::processAlgorithm( const QVariantMap &pa
25892589
}
25902590

25912591

2592-
void QgsRasterLayerUniqueValuesCountAlgorithm::initAlgorithm( const QVariantMap & )
2592+
void QgsRasterLayerUniqueValuesReportAlgorithm::initAlgorithm( const QVariantMap & )
25932593
{
25942594
addParameter( new QgsProcessingParameterRasterLayer( QStringLiteral( "INPUT" ),
25952595
QObject::tr( "Input layer" ) ) );
25962596
addParameter( new QgsProcessingParameterBand( QStringLiteral( "BAND" ),
25972597
QObject::tr( "Band number" ), 1, QStringLiteral( "INPUT" ) ) );
25982598
addParameter( new QgsProcessingParameterFileDestination( QStringLiteral( "OUTPUT_HTML_FILE" ),
2599-
QObject::tr( "Unique values count" ), QObject::tr( "HTML files (*.html)" ), QVariant(), true ) );
2600-
addOutput( new QgsProcessingOutputHtml( QStringLiteral( "OUTPUT_HTML_FILE" ), QObject::tr( "Unique values count" ) ) );
2599+
QObject::tr( "Unique values report" ), QObject::tr( "HTML files (*.html)" ), QVariant(), true ) );
2600+
2601+
addOutput( new QgsProcessingOutputHtml( QStringLiteral( "OUTPUT_HTML_FILE" ), QObject::tr( "Unique values report" ) ) );
2602+
2603+
addOutput( new QgsProcessingOutputString( QStringLiteral( "EXTENT" ), QObject::tr( "Extent" ) ) );
2604+
addOutput( new QgsProcessingOutputString( QStringLiteral( "CRS_AUTHID" ), QObject::tr( "CRS authority identifier" ) ) );
2605+
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "WIDTH_IN_PIXELS" ), QObject::tr( "Width in pixels" ) ) );
2606+
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "HEIGHT_IN_PIXELS" ), QObject::tr( "Height in pixels" ) ) );
2607+
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "TOTAL_PIXEL_COUNT" ), QObject::tr( "Total pixel count" ) ) );
2608+
addOutput( new QgsProcessingOutputNumber( QStringLiteral( "NODATA_PIXEL_COUNT" ), QObject::tr( "NODATA pixel count" ) ) );
26012609
}
26022610

2603-
QString QgsRasterLayerUniqueValuesCountAlgorithm::shortHelpString() const
2611+
QString QgsRasterLayerUniqueValuesReportAlgorithm::shortHelpString() const
26042612
{
2605-
return QObject::tr( "This algorithm returns the count of each unique value in a given raster layer." );
2613+
return QObject::tr( "This algorithm returns the count and area of each unique value in a given raster layer." );
26062614
}
26072615

2608-
QgsRasterLayerUniqueValuesCountAlgorithm *QgsRasterLayerUniqueValuesCountAlgorithm::createInstance() const
2616+
QgsRasterLayerUniqueValuesReportAlgorithm *QgsRasterLayerUniqueValuesReportAlgorithm::createInstance() const
26092617
{
2610-
return new QgsRasterLayerUniqueValuesCountAlgorithm();
2618+
return new QgsRasterLayerUniqueValuesReportAlgorithm();
26112619
}
26122620

2613-
QVariantMap QgsRasterLayerUniqueValuesCountAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
2621+
QVariantMap QgsRasterLayerUniqueValuesReportAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
26142622
{
26152623
QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT" ), context );
26162624
int band = parameterAsInt( parameters, QStringLiteral( "BAND" ), context );
@@ -2652,22 +2660,37 @@ QVariantMap QgsRasterLayerUniqueValuesCountAlgorithm::processAlgorithm( const QV
26522660
}
26532661

26542662
QVariantMap outputs;
2663+
outputs.insert( QStringLiteral( "EXTENT" ), layer->extent().toString() );
2664+
outputs.insert( QStringLiteral( "CRS_AUTHID" ), layer->crs().authid() );
2665+
outputs.insert( QStringLiteral( "WIDTH_IN_PIXELS" ), width );
2666+
outputs.insert( QStringLiteral( "HEIGHT_IN_PIXELS" ), height );
2667+
outputs.insert( QStringLiteral( "TOTAL_PIXEL_COUNT" ), width * height );
2668+
outputs.insert( QStringLiteral( "NODATA_PIXEL_COUNT" ), noDataCount );
2669+
26552670
if ( !outputFile.isEmpty() )
26562671
{
26572672
QFile file( outputFile );
26582673
if ( file.open( QIODevice::WriteOnly | QIODevice::Text ) )
26592674
{
2675+
QString areaUnit = QgsUnitTypes::toAbbreviatedString( QgsUnitTypes::distanceToAreaUnit( layer->crs().mapUnits() ) );
2676+
double cellArea = layer->rasterUnitsPerPixelX() * layer->rasterUnitsPerPixelY();
2677+
26602678
QTextStream out( &file );
26612679
out << QString( "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/></head><body>\n" );
2662-
out << QObject::tr( "<p>Analyzed file: %1 (band %2)</p>\n" ).arg( layer->source() ).arg( band );
2663-
out << QObject::tr( "<p>Total cell count: %1</p>\n" ).arg( width * height );
2680+
out << QString( "<p>%1: %2 (%3 %4)</p>\n" ).arg( QObject::tr( "Analyzed file" ) ).arg( layer->source() ).arg( QObject::tr( "band" ) ).arg( band );
2681+
out << QObject::tr( "<p>%1: %2</p>\n" ).arg( QObject::tr( "Extent" ) ).arg( layer->extent().toString() );
2682+
out << QObject::tr( "<p>%1: %2 (%3)</p>\n" ).arg( QObject::tr( "Projection" ) ).arg( layer->crs().description() ).arg( layer->crs().authid() );
2683+
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() );
2684+
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() );
2685+
out << QObject::tr( "<p>%1: %2</p>\n" ).arg( QObject::tr( "Total pixel count" ) ).arg( width * height );
26642686
if ( noDataCount > -1 )
2665-
out << QObject::tr( "<p>NODATA count: %1</p>\n" ).arg( noDataCount );
2666-
out << QString( "<table><tr><td>%1</td><td>%2</td></tr>\n" ).arg( QObject::tr( "Value" ) ).arg( QObject::tr( "Count" ) );
2687+
out << QObject::tr( "<p>%1: %2</p>\n" ).arg( QObject::tr( "NODATA pixel count" ) ).arg( noDataCount );
2688+
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 );
26672689

26682690
for ( double key : sortedUniqueValues.keys() )
26692691
{
2670-
out << QString( "<tr><td>%1</td><td>%2</td></tr>\n" ).arg( key ).arg( sortedUniqueValues[key] );
2692+
double area = sortedUniqueValues[key] * cellArea;
2693+
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 ) );
26712694
}
26722695
out << QString( "</table>\n</body></html>" );
26732696
outputs.insert( QStringLiteral( "OUTPUT_HTML_FILE" ), outputFile );

‎src/core/processing/qgsnativealgorithms.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -811,20 +811,21 @@ class QgsMeanCoordinatesAlgorithm : public QgsProcessingAlgorithm
811811
};
812812

813813
/**
814-
* Native raster layer unique values count algorithm.
814+
* Native raster layer unique values report algorithm.
815815
*/
816-
class QgsRasterLayerUniqueValuesCountAlgorithm : public QgsProcessingAlgorithm
816+
class QgsRasterLayerUniqueValuesReportAlgorithm : public QgsProcessingAlgorithm
817817
{
818818

819819
public:
820820

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

829830
protected:
830831

0 commit comments

Comments
 (0)
Please sign in to comment.