@@ -89,7 +89,7 @@ void QgsNativeAlgorithms::loadAlgorithms()
89
89
addAlgorithm ( new QgsLineIntersectionAlgorithm () );
90
90
addAlgorithm ( new QgsSplitWithLinesAlgorithm () );
91
91
addAlgorithm ( new QgsMeanCoordinatesAlgorithm () );
92
- addAlgorithm ( new QgsRasterLayerUniqueValuesCountAlgorithm () );
92
+ addAlgorithm ( new QgsRasterLayerUniqueValuesReportAlgorithm () );
93
93
}
94
94
95
95
void QgsSaveSelectedFeatures::initAlgorithm ( const QVariantMap & )
@@ -2589,28 +2589,36 @@ QVariantMap QgsMeanCoordinatesAlgorithm::processAlgorithm( const QVariantMap &pa
2589
2589
}
2590
2590
2591
2591
2592
- void QgsRasterLayerUniqueValuesCountAlgorithm ::initAlgorithm ( const QVariantMap & )
2592
+ void QgsRasterLayerUniqueValuesReportAlgorithm ::initAlgorithm ( const QVariantMap & )
2593
2593
{
2594
2594
addParameter ( new QgsProcessingParameterRasterLayer ( QStringLiteral ( " INPUT" ),
2595
2595
QObject::tr ( " Input layer" ) ) );
2596
2596
addParameter ( new QgsProcessingParameterBand ( QStringLiteral ( " BAND" ),
2597
2597
QObject::tr ( " Band number" ), 1 , QStringLiteral ( " INPUT" ) ) );
2598
2598
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" ) ) );
2601
2609
}
2602
2610
2603
- QString QgsRasterLayerUniqueValuesCountAlgorithm ::shortHelpString () const
2611
+ QString QgsRasterLayerUniqueValuesReportAlgorithm ::shortHelpString () const
2604
2612
{
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." );
2606
2614
}
2607
2615
2608
- QgsRasterLayerUniqueValuesCountAlgorithm * QgsRasterLayerUniqueValuesCountAlgorithm ::createInstance () const
2616
+ QgsRasterLayerUniqueValuesReportAlgorithm * QgsRasterLayerUniqueValuesReportAlgorithm ::createInstance () const
2609
2617
{
2610
- return new QgsRasterLayerUniqueValuesCountAlgorithm ();
2618
+ return new QgsRasterLayerUniqueValuesReportAlgorithm ();
2611
2619
}
2612
2620
2613
- QVariantMap QgsRasterLayerUniqueValuesCountAlgorithm ::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
2621
+ QVariantMap QgsRasterLayerUniqueValuesReportAlgorithm ::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
2614
2622
{
2615
2623
QgsRasterLayer *layer = parameterAsRasterLayer ( parameters, QStringLiteral ( " INPUT" ), context );
2616
2624
int band = parameterAsInt ( parameters, QStringLiteral ( " BAND" ), context );
@@ -2652,22 +2660,37 @@ QVariantMap QgsRasterLayerUniqueValuesCountAlgorithm::processAlgorithm( const QV
2652
2660
}
2653
2661
2654
2662
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
+
2655
2670
if ( !outputFile.isEmpty () )
2656
2671
{
2657
2672
QFile file ( outputFile );
2658
2673
if ( file.open ( QIODevice::WriteOnly | QIODevice::Text ) )
2659
2674
{
2675
+ QString areaUnit = QgsUnitTypes::toAbbreviatedString ( QgsUnitTypes::distanceToAreaUnit ( layer->crs ().mapUnits () ) );
2676
+ double cellArea = layer->rasterUnitsPerPixelX () * layer->rasterUnitsPerPixelY ();
2677
+
2660
2678
QTextStream out ( &file );
2661
2679
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 );
2664
2686
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 );
2667
2689
2668
2690
for ( double key : sortedUniqueValues.keys () )
2669
2691
{
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 ) );
2671
2694
}
2672
2695
out << QString ( " </table>\n </body></html>" );
2673
2696
outputs.insert ( QStringLiteral ( " OUTPUT_HTML_FILE" ), outputFile );
0 commit comments