28
28
from qgis .core import (QgsApplication ,
29
29
QgsWkbTypes ,
30
30
QgsPoint ,
31
- QgsFeatureSink ,
32
31
QgsCoordinateReferenceSystem ,
32
+ QgsFeatureRequest ,
33
33
QgsGeometry ,
34
- QgsProcessingUtils )
34
+ QgsProcessingUtils ,
35
+ QgsProcessingParameterDefinition ,
36
+ QgsProcessingParameterFeatureSink ,
37
+ QgsProcessingParameterFeatureSource ,
38
+ QgsProcessingParameterCrs ,
39
+ QgsProcessingOutputVectorLayer ,
40
+ QgsProcessingParameterField )
35
41
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
36
42
from processing .core .parameters import ParameterTable
37
43
from processing .core .parameters import ParameterTableField
@@ -50,6 +56,12 @@ class PointsLayerFromTable(QgisAlgorithm):
50
56
OUTPUT = 'OUTPUT'
51
57
TARGET_CRS = 'TARGET_CRS'
52
58
59
+ def icon (self ):
60
+ return QgsApplication .getThemeIcon ("/providerQgis.svg" )
61
+
62
+ def svgIconPath (self ):
63
+ return QgsApplication .iconPath ("providerQgis.svg" )
64
+
53
65
def tags (self ):
54
66
return self .tr ('points,create,values,attributes' ).split (',' )
55
67
@@ -58,19 +70,22 @@ def group(self):
58
70
59
71
def __init__ (self ):
60
72
super ().__init__ ()
61
- self .addParameter (ParameterTable (self .INPUT ,
62
- self .tr ('Input layer' )))
63
- self .addParameter (ParameterTableField (self .XFIELD ,
64
- self .tr ('X field' ), self .INPUT , ParameterTableField .DATA_TYPE_ANY ))
65
- self .addParameter (ParameterTableField (self .YFIELD ,
66
- self .tr ('Y field' ), self .INPUT , ParameterTableField .DATA_TYPE_ANY ))
67
- self .addParameter (ParameterTableField (self .ZFIELD ,
68
- self .tr ('Z field' ), self .INPUT , datatype = ParameterTableField .DATA_TYPE_ANY , optional = True ))
69
- self .addParameter (ParameterTableField (self .MFIELD ,
70
- self .tr ('M field' ), self .INPUT , datatype = ParameterTableField .DATA_TYPE_ANY , optional = True ))
71
- self .addParameter (ParameterCrs (self .TARGET_CRS ,
72
- self .tr ('Target CRS' ), 'EPSG:4326' ))
73
- self .addOutput (OutputVector (self .OUTPUT , self .tr ('Points from table' ), datatype = [dataobjects .TYPE_VECTOR_POINT ]))
73
+
74
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT , self .tr ('Input layer' ), types = [QgsProcessingParameterField .TypeTable ]))
75
+
76
+ self .addParameter (QgsProcessingParameterField (self .XFIELD ,
77
+ self .tr ('X field' ), parentLayerParameterName = self .INPUT , type = QgsProcessingParameterField .Any ))
78
+ self .addParameter (QgsProcessingParameterField (self .YFIELD ,
79
+ self .tr ('Y field' ), parentLayerParameterName = self .INPUT , type = QgsProcessingParameterField .Any ))
80
+ self .addParameter (QgsProcessingParameterField (self .ZFIELD ,
81
+ self .tr ('Z field' ), parentLayerParameterName = self .INPUT , type = QgsProcessingParameterField .Any , optional = True ))
82
+ self .addParameter (QgsProcessingParameterField (self .MFIELD ,
83
+ self .tr ('M field' ), parentLayerParameterName = self .INPUT , type = QgsProcessingParameterField .Any , optional = True ))
84
+ self .addParameter (QgsProcessingParameterCrs (self .TARGET_CRS ,
85
+ self .tr ('Target CRS' ), defaultValue = 'EPSG:4326' ))
86
+
87
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Points from table' ), type = QgsProcessingParameterDefinition .TypeVectorPoint ))
88
+ self .addOutput (QgsProcessingOutputVectorLayer (self .OUTPUT , self .tr ('Points from table' ), type = QgsProcessingParameterDefinition .TypeVectorPoint ))
74
89
75
90
def name (self ):
76
91
return 'createpointslayerfromtable'
@@ -79,36 +94,37 @@ def displayName(self):
79
94
return self .tr ('Create points layer from table' )
80
95
81
96
def processAlgorithm (self , parameters , context , feedback ):
82
- source = self .getParameterValue (self .INPUT )
83
- vlayer = QgsProcessingUtils .mapLayerFromString (source , context )
84
- output = self .getOutputFromName (self .OUTPUT )
85
-
86
- fields = vlayer .fields ()
87
- x_field_index = fields .lookupField (self .getParameterValue (self .XFIELD ))
88
- y_field_index = fields .lookupField (self .getParameterValue (self .YFIELD ))
89
- z_field_index = None
90
- if self .getParameterValue (self .ZFIELD ):
91
- z_field_index = fields .lookupField (self .getParameterValue (self .ZFIELD ))
92
- m_field_index = None
93
- if self .getParameterValue (self .MFIELD ):
94
- m_field_index = fields .lookupField (self .getParameterValue (self .MFIELD ))
97
+ source = self .parameterAsSource (parameters , self .INPUT , context )
98
+
99
+ fields = source .fields ()
100
+ x_field_index = fields .lookupField (self .parameterAsString (parameters , self .XFIELD , context ))
101
+ y_field_index = fields .lookupField (self .parameterAsString (parameters , self .YFIELD , context ))
102
+ z_field_index = - 1
103
+ if self .parameterAsString (parameters , self .ZFIELD , context ):
104
+ z_field_index = fields .lookupField (self .parameterAsString (parameters , self .ZFIELD , context ))
105
+ m_field_index = - 1
106
+ if self .parameterAsString (parameters , self .MFIELD , context ):
107
+ m_field_index = fields .lookupField (self .parameterAsString (parameters , self .MFIELD , context ))
95
108
96
109
wkb_type = QgsWkbTypes .Point
97
- if z_field_index is not None :
110
+ if z_field_index >= 0 :
98
111
wkb_type = QgsWkbTypes .addZ (wkb_type )
99
- if m_field_index is not None :
112
+ if m_field_index >= 0 :
100
113
wkb_type = QgsWkbTypes .addM (wkb_type )
101
114
102
- crsId = self .getParameterValue (self .TARGET_CRS )
103
- target_crs = QgsCoordinateReferenceSystem ()
104
- target_crs .createFromUserInput (crsId )
115
+ target_crs = self .parameterAsCrs (parameters , self .TARGET_CRS , context )
105
116
106
- writer = output .getVectorWriter (fields , wkb_type , target_crs , context )
117
+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
118
+ fields , wkb_type , target_crs )
107
119
108
- features = QgsProcessingUtils .getFeatures (vlayer , context )
109
- total = 100.0 / vlayer .featureCount () if vlayer .featureCount () else 0
120
+ request = QgsFeatureRequest ().setFlags (QgsFeatureRequest .NoGeometry )
121
+ features = source .getFeatures ()
122
+ total = 100.0 / source .featureCount () if source .featureCount () else 0
110
123
111
124
for current , feature in enumerate (features ):
125
+ if feedback .isCanceled ():
126
+ break
127
+
112
128
feedback .setProgress (int (current * total ))
113
129
attrs = feature .attributes ()
114
130
@@ -118,13 +134,13 @@ def processAlgorithm(self, parameters, context, feedback):
118
134
119
135
point = QgsPoint (x , y )
120
136
121
- if z_field_index is not None :
137
+ if z_field_index >= 0 :
122
138
try :
123
139
point .addZValue (float (attrs [z_field_index ]))
124
140
except :
125
141
point .addZValue (0.0 )
126
142
127
- if m_field_index is not None :
143
+ if m_field_index >= 0 :
128
144
try :
129
145
point .addMValue (float (attrs [m_field_index ]))
130
146
except :
@@ -134,6 +150,6 @@ def processAlgorithm(self, parameters, context, feedback):
134
150
except :
135
151
pass # no geometry
136
152
137
- writer .addFeature (feature , QgsFeatureSink . FastInsert )
153
+ sink .addFeature (feature )
138
154
139
- del writer
155
+ return { self . OUTPUT : dest_id }
0 commit comments