2525
2626__revision__ = '$Format:%H$'
2727
28- from qgis .core import Qgis , QgsWkbTypes
28+ from qgis .core import Qgis , QgsWkbTypes , QgsPointV2
2929from qgis .core import QgsCoordinateReferenceSystem
30- from qgis .core import QgsFeature
3130from qgis .core import QgsGeometry
32- from qgis .core import QgsPoint
3331from processing .core .GeoAlgorithm import GeoAlgorithm
3432from processing .core .parameters import ParameterTable
3533from processing .core .parameters import ParameterTableField
@@ -43,18 +41,25 @@ class PointsLayerFromTable(GeoAlgorithm):
4341 INPUT = 'INPUT'
4442 XFIELD = 'XFIELD'
4543 YFIELD = 'YFIELD'
44+ ZFIELD = 'ZFIELD'
45+ MFIELD = 'MFIELD'
4646 OUTPUT = 'OUTPUT'
4747 TARGET_CRS = 'TARGET_CRS'
4848
4949 def defineCharacteristics (self ):
50- self .name , self .i18n_name = self .trAlgorithm ('Points layer from table' )
50+ self .name , self .i18n_name = self .trAlgorithm ('Create points layer from table' )
5151 self .group , self .i18n_group = self .trAlgorithm ('Vector creation tools' )
52+ self .tags = self .tr ('points,create,values,attributes' )
5253 self .addParameter (ParameterTable (self .INPUT ,
5354 self .tr ('Input layer' )))
5455 self .addParameter (ParameterTableField (self .XFIELD ,
5556 self .tr ('X field' ), self .INPUT , ParameterTableField .DATA_TYPE_ANY ))
5657 self .addParameter (ParameterTableField (self .YFIELD ,
5758 self .tr ('Y field' ), self .INPUT , ParameterTableField .DATA_TYPE_ANY ))
59+ self .addParameter (ParameterTableField (self .ZFIELD ,
60+ self .tr ('Z field' ), self .INPUT , datatype = ParameterTableField .DATA_TYPE_ANY , optional = True ))
61+ self .addParameter (ParameterTableField (self .MFIELD ,
62+ self .tr ('M field' ), self .INPUT , datatype = ParameterTableField .DATA_TYPE_ANY , optional = True ))
5863 self .addParameter (ParameterCrs (self .TARGET_CRS ,
5964 self .tr ('Target CRS' ), 'EPSG:4326' ))
6065 self .addOutput (OutputVector (self .OUTPUT , self .tr ('Points from table' ), datatype = [dataobjects .TYPE_VECTOR_POINT ]))
@@ -63,30 +68,58 @@ def processAlgorithm(self, progress):
6368 source = self .getParameterValue (self .INPUT )
6469 vlayer = dataobjects .getObjectFromUri (source )
6570 output = self .getOutputFromName (self .OUTPUT )
71+
6672 fields = vlayer .fields ()
67- writer = output .getVectorWriter (fields , QgsWkbTypes .Point , self .crs )
68- xfieldindex = vlayer .fields ().lookupField (self .getParameterValue (self .XFIELD ))
69- yfieldindex = vlayer .fields ().lookupField (self .getParameterValue (self .YFIELD ))
73+ x_field_index = fields .lookupField (self .getParameterValue (self .XFIELD ))
74+ y_field_index = fields .lookupField (self .getParameterValue (self .YFIELD ))
75+ z_field_index = None
76+ if self .getParameterValue (self .ZFIELD ):
77+ z_field_index = fields .lookupField (self .getParameterValue (self .ZFIELD ))
78+ m_field_index = None
79+ if self .getParameterValue (self .MFIELD ):
80+ m_field_index = fields .lookupField (self .getParameterValue (self .MFIELD ))
81+
82+ wkb_type = QgsWkbTypes .Point
83+ if z_field_index is not None :
84+ wkb_type = QgsWkbTypes .addZ (wkb_type )
85+ if m_field_index is not None :
86+ wkb_type = QgsWkbTypes .addM (wkb_type )
7087
7188 crsId = self .getParameterValue (self .TARGET_CRS )
72- targetCrs = QgsCoordinateReferenceSystem ()
73- targetCrs .createFromUserInput (crsId )
74- self .crs = targetCrs
89+ target_crs = QgsCoordinateReferenceSystem ()
90+ target_crs .createFromUserInput (crsId )
91+
92+ writer = output .getVectorWriter (fields , wkb_type , target_crs )
7593
76- outFeat = QgsFeature ()
7794 features = vector .features (vlayer )
7895 total = 100.0 / len (features )
96+
7997 for current , feature in enumerate (features ):
8098 progress .setPercentage (int (current * total ))
8199 attrs = feature .attributes ()
100+
82101 try :
83- x = float (attrs [xfieldindex ])
84- y = float (attrs [yfieldindex ])
102+ x = float (attrs [x_field_index ])
103+ y = float (attrs [y_field_index ])
104+
105+ point = QgsPointV2 (x , y )
106+
107+ if z_field_index is not None :
108+ try :
109+ point .addZValue (float (attrs [z_field_index ]))
110+ except :
111+ point .addZValue (0.0 )
112+
113+ if m_field_index is not None :
114+ try :
115+ point .addMValue (float (attrs [m_field_index ]))
116+ except :
117+ point .addMValue (0.0 )
118+
119+ feature .setGeometry (QgsGeometry (point ))
85120 except :
86- continue
87- pt = QgsPoint (x , y )
88- outFeat .setGeometry (QgsGeometry .fromPoint (pt ))
89- outFeat .setAttributes (attrs )
90- writer .addFeature (outFeat )
121+ pass # no geometry
122+
123+ writer .addFeature (feature )
91124
92125 del writer
0 commit comments