31
31
from qgis .PyQt .QtGui import QIcon
32
32
from qgis .PyQt .QtCore import QVariant
33
33
34
- from qgis .core import QgsFeature , QgsGeometry , QgsWkbTypes , QgsField , QgsFeatureSink , QgsProcessingUtils
34
+ from qgis .core import (QgsFeature ,
35
+ QgsGeometry ,
36
+ QgsWkbTypes ,
37
+ QgsField ,
38
+ QgsFeatureSink ,
39
+ QgsProcessing ,
40
+ QgsProcessingParameterFeatureSource ,
41
+ QgsProcessingParameterFeatureSink )
35
42
36
43
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
37
- from processing .core .parameters import ParameterVector
38
- from processing .core .outputs import OutputVector
39
- from processing .tools import dataobjects , vector
40
44
41
45
pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
42
46
@@ -56,12 +60,10 @@ def __init__(self):
56
60
super ().__init__ ()
57
61
58
62
def initAlgorithm (self , config = None ):
59
- self .addParameter (ParameterVector (self .INPUT ,
60
- self .tr ('Input layer' ),
61
- [dataobjects .TYPE_VECTOR_POLYGON ,
62
- dataobjects .TYPE_VECTOR_LINE ]))
63
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
64
+ self .tr ('Input layer' )))
63
65
64
- self .addOutput ( OutputVector (self .OUTPUT , self .tr ('Nodes' ), datatype = [ dataobjects . TYPE_VECTOR_POINT ] ))
66
+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Nodes' ), QgsProcessing . TypeVectorPoint ))
65
67
66
68
def name (self ):
67
69
return 'extractnodes'
@@ -70,36 +72,51 @@ def displayName(self):
70
72
return self .tr ('Extract nodes' )
71
73
72
74
def processAlgorithm (self , parameters , context , feedback ):
73
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
75
+ source = self .parameterAsSource ( parameters , self .INPUT , context )
74
76
75
- fields = layer .fields ()
77
+ fields = source .fields ()
76
78
fields .append (QgsField ('node_index' , QVariant .Int ))
77
79
fields .append (QgsField ('distance' , QVariant .Double ))
78
80
fields .append (QgsField ('angle' , QVariant .Double ))
79
81
80
- writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (fields , QgsWkbTypes .Point , layer .crs (), context )
82
+ out_wkb = QgsWkbTypes .Point
83
+ if QgsWkbTypes .hasM (source .wkbType ()):
84
+ out_wkb = QgsWkbTypes .addM (out_wkb )
85
+ if QgsWkbTypes .hasZ (source .wkbType ()):
86
+ out_wkb = QgsWkbTypes .addZ (out_wkb )
81
87
82
- features = QgsProcessingUtils .getFeatures (layer , context )
83
- total = 100.0 / layer .featureCount () if layer .featureCount () else 0
88
+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
89
+ fields , out_wkb , source .sourceCrs ())
90
+
91
+ features = source .getFeatures ()
92
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
84
93
for current , f in enumerate (features ):
94
+ if feedback .isCanceled ():
95
+ break
96
+
85
97
input_geometry = f .geometry ()
86
98
if not input_geometry :
87
- writer .addFeature (f , QgsFeatureSink .FastInsert )
99
+ sink .addFeature (f , QgsFeatureSink .FastInsert )
88
100
else :
89
- points = vector .extractPoints (input_geometry )
90
-
91
- for i , point in enumerate (points ):
92
- distance = input_geometry .distanceToVertex (i )
93
- angle = math .degrees (input_geometry .angleAtVertex (i ))
94
- attrs = f .attributes ()
95
- attrs .append (i )
96
- attrs .append (distance )
97
- attrs .append (angle )
98
- output_feature = QgsFeature ()
99
- output_feature .setAttributes (attrs )
100
- output_feature .setGeometry (QgsGeometry .fromPoint (point ))
101
- writer .addFeature (output_feature , QgsFeatureSink .FastInsert )
101
+ i = 0
102
+ for part in input_geometry .geometry ().coordinateSequence ():
103
+ for ring in part :
104
+ if feedback .isCanceled ():
105
+ break
106
+
107
+ for point in ring :
108
+ distance = input_geometry .distanceToVertex (i )
109
+ angle = math .degrees (input_geometry .angleAtVertex (i ))
110
+ attrs = f .attributes ()
111
+ attrs .append (i )
112
+ attrs .append (distance )
113
+ attrs .append (angle )
114
+ output_feature = QgsFeature ()
115
+ output_feature .setAttributes (attrs )
116
+ output_feature .setGeometry (QgsGeometry (point .clone ()))
117
+ sink .addFeature (output_feature , QgsFeatureSink .FastInsert )
118
+ i += 1
102
119
103
120
feedback .setProgress (int (current * total ))
104
121
105
- del writer
122
+ return { self . OUTPUT : dest_id }
0 commit comments