QGIS API Documentation  3.14.0-Pi (9f7028fd23)
qgsalgorithmextentfromlayer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsalgorithmextentfromlayer.cpp
3  ---------------------
4  begin : November 2019
5  copyright : (C) 2019 by Alexander Bruy
6  email : alexander dot bruy at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
19 #include "qgsapplication.h"
20 #include "qgsvectorlayer.h"
21 
23 
24 QString QgsExtentFromLayerAlgorithm::name() const
25 {
26  return QStringLiteral( "polygonfromlayerextent" );
27 }
28 
29 QString QgsExtentFromLayerAlgorithm::displayName() const
30 {
31  return QObject::tr( "Extract layer extent" );
32 }
33 
34 QStringList QgsExtentFromLayerAlgorithm::tags() const
35 {
36  return QObject::tr( "polygon,vector,raster,extent,envelope,bounds,bounding,boundary,layer,round,rounded" ).split( ',' );
37 }
38 
39 QString QgsExtentFromLayerAlgorithm::group() const
40 {
41  return QObject::tr( "Layer tools" );
42 }
43 
44 QString QgsExtentFromLayerAlgorithm::groupId() const
45 {
46  return QStringLiteral( "layertools" );
47 }
48 
49 QString QgsExtentFromLayerAlgorithm::shortHelpString() const
50 {
51  return QObject::tr( "This algorithm takes a map layer and generates a new vector "
52  "layer with the minimum bounding box (rectangle polygon with "
53  "N-S orientation) that covers the input layer. Optionally, the "
54  "extent can be enlarged to a rounded value." );
55 }
56 
57 QString QgsExtentFromLayerAlgorithm::svgIconPath() const
58 {
59  return QgsApplication::iconPath( QStringLiteral( "/algorithms/mAlgorithmExtractLayerExtent.svg" ) );
60 }
61 
62 QIcon QgsExtentFromLayerAlgorithm::icon() const
63 {
64  return QgsApplication::getThemeIcon( QStringLiteral( "/algorithms/mAlgorithmExtractLayerExtent.svg" ) );
65 }
66 
67 QgsExtentFromLayerAlgorithm *QgsExtentFromLayerAlgorithm::createInstance() const
68 {
69  return new QgsExtentFromLayerAlgorithm();
70 }
71 
72 void QgsExtentFromLayerAlgorithm::initAlgorithm( const QVariantMap & )
73 {
74  addParameter( new QgsProcessingParameterMapLayer( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
75 
76  auto roundParam = qgis::make_unique < QgsProcessingParameterDistance >( QStringLiteral( "ROUND_TO" ), QObject::tr( "Round values to" ), 0, QStringLiteral( "INPUT" ), 0 );
77  roundParam->setFlags( QgsProcessingParameterDefinition::FlagAdvanced );
78  addParameter( roundParam.release() );
79 
80  addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Extent" ), QgsProcessing::TypeVectorPolygon ) );
81 }
82 
83 QVariantMap QgsExtentFromLayerAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
84 {
85  QgsMapLayer *layer = parameterAsLayer( parameters, QStringLiteral( "INPUT" ), context );
86 
87  if ( !layer )
88  throw QgsProcessingException( QObject::tr( "Invalid input layer" ) );
89 
90  double roundTo = parameterAsDouble( parameters, QStringLiteral( "ROUND_TO" ), context );
91 
92  QgsFields fields;
93  fields.append( QgsField( QStringLiteral( "MINX" ), QVariant::Double ) );
94  fields.append( QgsField( QStringLiteral( "MINY" ), QVariant::Double ) );
95  fields.append( QgsField( QStringLiteral( "MAXX" ), QVariant::Double ) );
96  fields.append( QgsField( QStringLiteral( "MAXY" ), QVariant::Double ) );
97  fields.append( QgsField( QStringLiteral( "CNTX" ), QVariant::Double ) );
98  fields.append( QgsField( QStringLiteral( "CNTY" ), QVariant::Double ) );
99  fields.append( QgsField( QStringLiteral( "AREA" ), QVariant::Double ) );
100  fields.append( QgsField( QStringLiteral( "PERIM" ), QVariant::Double ) );
101  fields.append( QgsField( QStringLiteral( "HEIGHT" ), QVariant::Double ) );
102  fields.append( QgsField( QStringLiteral( "WIDTH" ), QVariant::Double ) );
103 
104  QString dest;
105  std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( "OUTPUT" ), context, dest, fields, QgsWkbTypes::Polygon, layer->crs() ) );
106  if ( !sink )
107  throw QgsProcessingException( invalidSinkError( parameters, QStringLiteral( "OUTPUT" ) ) );
108 
109  if ( QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( layer ) )
110  {
111  vl->updateExtents();
112  }
113 
114  QgsRectangle rect = layer->extent();
115 
116  if ( roundTo > 0 )
117  {
118  rect.setXMinimum( std::floor( rect.xMinimum() / roundTo ) * roundTo );
119  rect.setYMinimum( std::floor( rect.yMinimum() / roundTo ) * roundTo );
120  rect.setXMaximum( std::ceil( rect.xMaximum() / roundTo ) * roundTo );
121  rect.setYMaximum( std::ceil( rect.yMaximum() / roundTo ) * roundTo );
122  }
123 
124  QgsGeometry geom = QgsGeometry::fromRect( rect );
125 
126  double minX = rect.xMinimum();
127  double maxX = rect.xMaximum();
128  double minY = rect.yMinimum();
129  double maxY = rect.yMaximum();
130  double height = rect.height();
131  double width = rect.width();
132  double cntX = minX + width / 2.0;
133  double cntY = minY + height / 2.0;
134  double area = width * height;
135  double perim = 2 * width + 2 * height;
136 
137  QgsFeature feat;
138  feat.setGeometry( geom );
139  feat.setAttributes( QgsAttributes() << minX << minY << maxX << maxY << cntX << cntY << area << perim << height << width );
140  sink->addFeature( feat, QgsFeatureSink::FastInsert );
141 
142  QVariantMap outputs;
143  outputs.insert( QStringLiteral( "OUTPUT" ), dest );
144  return outputs;
145 }
146 
QgsMapLayer::crs
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:88
QgsApplication::getThemeIcon
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
Definition: qgsapplication.cpp:605
QgsRectangle::setXMinimum
void setXMinimum(double x)
Set the minimum x value.
Definition: qgsrectangle.h:130
QgsProcessingFeedback
Definition: qgsprocessingfeedback.h:37
QgsRectangle::xMaximum
double xMaximum() const
Returns the x maximum value (right side of rectangle).
Definition: qgsrectangle.h:162
QgsProcessing::TypeVectorPolygon
@ TypeVectorPolygon
Vector polygon layers.
Definition: qgsprocessing.h:50
QgsFields
Definition: qgsfields.h:44
QgsProcessingParameterDefinition::FlagAdvanced
@ FlagAdvanced
Parameter is an advanced parameter which should be hidden from users by default.
Definition: qgsprocessingparameters.h:419
QgsProcessingParameterMapLayer
Definition: qgsprocessingparameters.h:2456
QgsFields::append
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
Definition: qgsfields.cpp:59
QgsApplication::iconPath
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
Definition: qgsapplication.cpp:594
QgsRectangle
Definition: qgsrectangle.h:41
QgsGeometry::fromRect
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
Definition: qgsgeometry.cpp:229
QgsProcessingParameterFeatureSink
Definition: qgsprocessingparameters.h:2773
qgsapplication.h
qgsalgorithmextentfromlayer.h
QgsFeature::setGeometry
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Definition: qgsfeature.cpp:137
QgsProcessingContext
Definition: qgsprocessingcontext.h:43
QgsMapLayer::extent
virtual QgsRectangle extent() const
Returns the extent of the layer.
Definition: qgsmaplayer.cpp:197
QgsRectangle::setXMaximum
void setXMaximum(double x)
Set the maximum x value.
Definition: qgsrectangle.h:135
QgsRectangle::yMaximum
double yMaximum() const
Returns the y maximum value (top side of rectangle).
Definition: qgsrectangle.h:172
qgsvectorlayer.h
QgsGeometry
Definition: qgsgeometry.h:122
QgsVectorLayer
Definition: qgsvectorlayer.h:385
QgsMapLayer
Definition: qgsmaplayer.h:81
QgsWkbTypes::Polygon
@ Polygon
Definition: qgswkbtypes.h:73
QgsRectangle::height
double height() const
Returns the height of the rectangle.
Definition: qgsrectangle.h:209
QgsRectangle::yMinimum
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
Definition: qgsrectangle.h:177
QgsAttributes
Definition: qgsattributes.h:57
QgsFeature
Definition: qgsfeature.h:55
QgsFeature::setAttributes
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
Definition: qgsfeature.cpp:127
QgsProcessingException
Definition: qgsexception.h:82
QgsRectangle::width
double width() const
Returns the width of the rectangle.
Definition: qgsrectangle.h:202
QgsRectangle::setYMinimum
void setYMinimum(double y)
Set the minimum y value.
Definition: qgsrectangle.h:140
QgsRectangle::setYMaximum
void setYMaximum(double y)
Set the maximum y value.
Definition: qgsrectangle.h:145
QgsRectangle::xMinimum
double xMinimum() const
Returns the x minimum value (left side of rectangle).
Definition: qgsrectangle.h:167
QgsFeatureSink::FastInsert
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
Definition: qgsfeaturesink.h:70
QgsField
Definition: qgsfield.h:49