34
34
QgsField ,
35
35
QgsWkbTypes ,
36
36
QgsFeatureSink ,
37
- QgsProcessingUtils ,
38
- QgsDistanceArea )
37
+ QgsDistanceArea ,
38
+ QgsProcessingParameterFeatureSource ,
39
+ QgsProcessingParameterEnum ,
40
+ QgsProcessingParameterFeatureSink )
39
41
40
42
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
41
- from processing .core .parameters import ParameterVector
42
- from processing .core .parameters import ParameterSelection
43
- from processing .core .outputs import OutputVector
44
43
from processing .tools import vector
45
44
46
45
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
@@ -66,18 +65,16 @@ def __init__(self):
66
65
self .export_z = False
67
66
self .export_m = False
68
67
self .distance_area = None
69
-
70
- def initAlgorithm (self , config = None ):
71
68
self .calc_methods = [self .tr ('Layer CRS' ),
72
69
self .tr ('Project CRS' ),
73
70
self .tr ('Ellipsoidal' )]
74
71
75
- self . addParameter ( ParameterVector ( self . INPUT ,
76
- self .tr ( 'Input layer' )))
77
- self .addParameter ( ParameterSelection ( self . METHOD ,
78
- self .tr ( 'Calculate using' ), self .calc_methods , 0 ))
79
-
80
- self .addOutput ( OutputVector (self .OUTPUT , self .tr ('Added geom info' )))
72
+ def initAlgorithm ( self , config = None ):
73
+ self .addParameter ( QgsProcessingParameterFeatureSource ( self . INPUT ,
74
+ self .tr ( 'Input layer' )))
75
+ self .addParameter ( QgsProcessingParameterEnum ( self .METHOD ,
76
+ self . tr ( 'Calculate using' ), options = self . calc_methods , defaultValue = 0 ))
77
+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Added geom info' )))
81
78
82
79
def name (self ):
83
80
return 'exportaddgeometrycolumns'
@@ -86,36 +83,36 @@ def displayName(self):
86
83
return self .tr ('Export/Add geometry columns' )
87
84
88
85
def processAlgorithm (self , parameters , context , feedback ):
89
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
90
- method = self .getParameterValue ( self .METHOD )
86
+ source = self .parameterAsSource ( parameters , self .INPUT , context )
87
+ method = self .parameterAsEnum ( parameters , self .METHOD , context )
91
88
92
- geometryType = layer . geometryType ()
93
- fields = layer .fields ()
89
+ wkb_type = source . wkbType ()
90
+ fields = source .fields ()
94
91
95
- if geometryType == QgsWkbTypes .PolygonGeometry :
92
+ if QgsWkbTypes . geometryType ( wkb_type ) == QgsWkbTypes .PolygonGeometry :
96
93
areaName = vector .createUniqueFieldName ('area' , fields )
97
94
fields .append (QgsField (areaName , QVariant .Double ))
98
95
perimeterName = vector .createUniqueFieldName ('perimeter' , fields )
99
96
fields .append (QgsField (perimeterName , QVariant .Double ))
100
- elif geometryType == QgsWkbTypes .LineGeometry :
97
+ elif QgsWkbTypes . geometryType ( wkb_type ) == QgsWkbTypes .LineGeometry :
101
98
lengthName = vector .createUniqueFieldName ('length' , fields )
102
99
fields .append (QgsField (lengthName , QVariant .Double ))
103
100
else :
104
101
xName = vector .createUniqueFieldName ('xcoord' , fields )
105
102
fields .append (QgsField (xName , QVariant .Double ))
106
103
yName = vector .createUniqueFieldName ('ycoord' , fields )
107
104
fields .append (QgsField (yName , QVariant .Double ))
108
- if QgsWkbTypes .hasZ (layer .wkbType ()):
105
+ if QgsWkbTypes .hasZ (source .wkbType ()):
109
106
self .export_z = True
110
107
zName = vector .createUniqueFieldName ('zcoord' , fields )
111
108
fields .append (QgsField (zName , QVariant .Double ))
112
- if QgsWkbTypes .hasM (layer .wkbType ()):
109
+ if QgsWkbTypes .hasM (source .wkbType ()):
113
110
self .export_m = True
114
111
zName = vector .createUniqueFieldName ('mvalue' , fields )
115
112
fields .append (QgsField (zName , QVariant .Double ))
116
113
117
- writer = self .getOutputFromName ( self .OUTPUT ). getVectorWriter ( fields , layer . wkbType (), layer . crs () ,
118
- context )
114
+ ( sink , dest_id ) = self .parameterAsSink ( parameters , self .OUTPUT , context ,
115
+ fields , wkb_type , source . sourceCrs () )
119
116
120
117
coordTransform = None
121
118
@@ -126,14 +123,17 @@ def processAlgorithm(self, parameters, context, feedback):
126
123
127
124
self .distance_area = QgsDistanceArea ()
128
125
if method == 2 :
129
- self .distance_area .setSourceCrs (layer . crs ())
126
+ self .distance_area .setSourceCrs (source . sourceCrs ())
130
127
self .distance_area .setEllipsoid (context .project ().ellipsoid ())
131
128
elif method == 1 :
132
- coordTransform = QgsCoordinateTransform (layer . crs (), context .project ().crs ())
129
+ coordTransform = QgsCoordinateTransform (source . sourceCrs (), context .project ().crs ())
133
130
134
- features = QgsProcessingUtils .getFeatures (layer , context )
135
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
131
+ features = source .getFeatures ()
132
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
136
133
for current , f in enumerate (features ):
134
+ if feedback .isCanceled ():
135
+ break
136
+
137
137
outFeat = f
138
138
attrs = f .attributes ()
139
139
inGeom = f .geometry ()
@@ -149,11 +149,11 @@ def processAlgorithm(self, parameters, context, feedback):
149
149
attrs .extend (self .line_attributes (inGeom ))
150
150
151
151
outFeat .setAttributes (attrs )
152
- writer .addFeature (outFeat , QgsFeatureSink .FastInsert )
152
+ sink .addFeature (outFeat , QgsFeatureSink .FastInsert )
153
153
154
154
feedback .setProgress (int (current * total ))
155
155
156
- del writer
156
+ return { self . OUTPUT : dest_id }
157
157
158
158
def point_attributes (self , geometry ):
159
159
pt = None
0 commit comments