mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-13 00:03:09 -04:00
[processing] add area to raster layer unique values report algorithm (#5334)
This commit is contained in:
parent
8759e7cd03
commit
61dcba4a81
@ -1,25 +0,0 @@
|
||||
<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>Total cell count: 224</p>
|
||||
<p>NODATA count: 104</p>
|
||||
<table><tr><td>Value</td><td>Count</td></tr>
|
||||
<tr><td>826</td><td>4</td></tr>
|
||||
<tr><td>837</td><td>6</td></tr>
|
||||
<tr><td>843</td><td>6</td></tr>
|
||||
<tr><td>845</td><td>4</td></tr>
|
||||
<tr><td>851</td><td>9</td></tr>
|
||||
<tr><td>853</td><td>6</td></tr>
|
||||
<tr><td>859</td><td>10</td></tr>
|
||||
<tr><td>861</td><td>4</td></tr>
|
||||
<tr><td>864</td><td>6</td></tr>
|
||||
<tr><td>866</td><td>9</td></tr>
|
||||
<tr><td>868</td><td>6</td></tr>
|
||||
<tr><td>872</td><td>4</td></tr>
|
||||
<tr><td>873</td><td>9</td></tr>
|
||||
<tr><td>878</td><td>6</td></tr>
|
||||
<tr><td>880</td><td>6</td></tr>
|
||||
<tr><td>881</td><td>6</td></tr>
|
||||
<tr><td>890</td><td>13</td></tr>
|
||||
<tr><td>899</td><td>6</td></tr>
|
||||
</table>
|
||||
</body></html>
|
29
python/plugins/processing/tests/testdata/expected/raster_unique_values_report.html
vendored
Normal file
29
python/plugins/processing/tests/testdata/expected/raster_unique_values_report.html
vendored
Normal file
@ -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>
|
@ -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
|
||||
@ -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
|
||||
|
@ -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 & )
|
||||
@ -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 ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
|
||||
QVariantMap QgsRasterLayerUniqueValuesReportAlgorithm::processAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
|
||||
{
|
||||
QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT" ), context );
|
||||
int band = parameterAsInt( parameters, QStringLiteral( "BAND" ), context );
|
||||
@ -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 );
|
||||
|
@ -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:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user