3636 QgsFeature ,
3737 QgsWkbTypes ,
3838 QgsProcessingUtils ,
39+ QgsProcessingParameterFeatureSource ,
40+ QgsProcessingParameterFeatureSink ,
41+ QgsProcessingOutputVectorLayer ,
42+ QgsProcessingParameterBoolean ,
43+ QgsProcessingParameterDefinition ,
3944 QgsFields )
4045
4146from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
@@ -65,12 +70,13 @@ def group(self):
6570
6671 def __init__ (self ):
6772 super ().__init__ ()
68- self .addParameter (ParameterVector (self .INPUT_LAYER ,
69- self .tr ('Input layer' )))
70- self .addParameter (ParameterBoolean (self .BY_FEATURE ,
71- self .tr ('Calculate extent for each feature separately' ), False ))
7273
73- self .addOutput (OutputVector (self .OUTPUT , self .tr ('Extent' ), datatype = [dataobjects .TYPE_VECTOR_POLYGON ]))
74+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT_LAYER , self .tr ('Input layer' )))
75+ self .addParameter (QgsProcessingParameterBoolean (self .BY_FEATURE ,
76+ self .tr ('Calculate extent for each feature separately' ), False ))
77+
78+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Extent' )))
79+ self .addOutput (QgsProcessingOutputVectorLayer (self .OUTPUT , self .tr ("Extent" ), QgsProcessingParameterDefinition .TypeVectorPolygon ))
7480
7581 def name (self ):
7682 return 'polygonfromlayerextent'
@@ -79,8 +85,8 @@ def displayName(self):
7985 return self .tr ('Polygon from layer extent' )
8086
8187 def processAlgorithm (self , parameters , context , feedback ):
82- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT_LAYER ) , context )
83- byFeature = self .getParameterValue ( self .BY_FEATURE )
88+ source = self .parameterAsSource ( parameters , self .INPUT_LAYER , context )
89+ byFeature = self .parameterAsBool ( parameters , self .BY_FEATURE , context )
8490
8591 fields = QgsFields ()
8692 fields .append (QgsField ('MINX' , QVariant .Double ))
@@ -94,17 +100,19 @@ def processAlgorithm(self, parameters, context, feedback):
94100 fields .append (QgsField ('HEIGHT' , QVariant .Double ))
95101 fields .append (QgsField ('WIDTH' , QVariant .Double ))
96102
97- writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (fields , QgsWkbTypes .Polygon , layer .crs (), context )
103+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
104+ fields , QgsWkbTypes .Polygon , source .sourceCrs ())
98105
99106 if byFeature :
100- self .featureExtent (layer , context , writer , feedback )
107+ self .featureExtent (source , context , sink , feedback )
101108 else :
102- self .layerExtent (layer , writer , feedback )
109+ self .layerExtent (source , sink , feedback )
103110
104- del writer
111+ return { self . OUTPUT : dest_id }
105112
106- def layerExtent (self , layer , writer , feedback ):
107- rect = layer .extent ()
113+ def layerExtent (self , source , sink , feedback ):
114+ rect = source .sourceExtent ()
115+ geometry = QgsGeometry .fromRect (rect )
108116 minx = rect .xMinimum ()
109117 miny = rect .yMinimum ()
110118 maxx = rect .xMaximum ()
@@ -116,9 +124,6 @@ def layerExtent(self, layer, writer, feedback):
116124 area = width * height
117125 perim = 2 * width + 2 * height
118126
119- rect = [QgsPointXY (minx , miny ), QgsPointXY (minx , maxy ), QgsPointXY (maxx ,
120- maxy ), QgsPointXY (maxx , miny ), QgsPointXY (minx , miny )]
121- geometry = QgsGeometry ().fromPolygon ([rect ])
122127 feat = QgsFeature ()
123128 feat .setGeometry (geometry )
124129 attrs = [
@@ -134,13 +139,16 @@ def layerExtent(self, layer, writer, feedback):
134139 width ,
135140 ]
136141 feat .setAttributes (attrs )
137- writer .addFeature (feat )
142+ sink .addFeature (feat )
138143
139- def featureExtent (self , layer , context , writer , feedback ):
140- features = QgsProcessingUtils .getFeatures (layer , context )
141- total = 100.0 / QgsProcessingUtils .featureCount (layer , context )
144+ def featureExtent (self , source , context , sink , feedback ):
145+ features = source .getFeatures ()
146+ total = 100.0 / source .featureCount ()
142147 feat = QgsFeature ()
143148 for current , f in enumerate (features ):
149+ if feedback .isCanceled ():
150+ break
151+
144152 rect = f .geometry ().boundingBox ()
145153 minx = rect .xMinimum ()
146154 miny = rect .yMinimum ()
@@ -171,5 +179,5 @@ def featureExtent(self, layer, context, writer, feedback):
171179 ]
172180 feat .setAttributes (attrs )
173181
174- writer .addFeature (feat )
182+ sink .addFeature (feat )
175183 feedback .setProgress (int (current * total ))
0 commit comments