1
- from sextante .core .GeoAlgorithm import GeoAlgorithm
2
1
import os .path
2
+
3
3
from PyQt4 import QtGui
4
4
from PyQt4 .QtCore import *
5
- from PyQt4 . QtGui import *
5
+
6
6
from qgis .core import *
7
- from sextante . parameters . ParameterVector import ParameterVector
8
- from sextante .core .QGisLayers import QGisLayers
7
+
8
+ from sextante .core .GeoAlgorithm import GeoAlgorithm
9
9
from sextante .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
10
+ from sextante .core .QGisLayers import QGisLayers
11
+
12
+ from sextante .parameters .ParameterVector import ParameterVector
13
+
10
14
from sextante .outputs .OutputVector import OutputVector
11
15
12
16
class MultipartToSingleparts (GeoAlgorithm ):
@@ -17,79 +21,90 @@ class MultipartToSingleparts(GeoAlgorithm):
17
21
def getIcon (self ):
18
22
return QtGui .QIcon (os .path .dirname (__file__ ) + "/icons/multi_to_single.png" )
19
23
24
+ def defineCharacteristics (self ):
25
+ self .name = "Multipart to singleparts"
26
+ self .group = "Geometry tools"
27
+
28
+ self .addParameter (ParameterVector (self .INPUT , "Input layer" ))
29
+ self .addOutput (OutputVector (self .OUTPUT , "Output layer" ))
30
+
20
31
def processAlgorithm (self , progress ):
21
- vlayer = QGisLayers .getObjectFromUri (self .getParameterValue (self .INPUT ))
22
- vprovider = vlayer .dataProvider ()
23
- allAttrs = vprovider .attributeIndexes ()
24
- vprovider .select ( allAttrs )
25
- fields = vprovider .fields ()
26
- geomType = self .multiToSingleGeom (vprovider .geometryType ())
27
- writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (fields , geomType , vprovider .crs () )
32
+ settings = QSettings ()
33
+ encoding = settings .value ( "/UI/encoding" , "System" ).toString ()
34
+
35
+ layer = QGisLayers .getObjectFromUri (self .getParameterValue (self .INPUT ))
36
+ output = self .getOutputValue (self .OUTPUT )
37
+
38
+ provider = layer .dataProvider ()
39
+ layer .select (layer .pendingAllAttributesList ())
40
+
41
+ geomType = self .multiToSingleGeom (provider .geometryType ())
42
+
43
+ writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (layer .pendingFields (),
44
+ geomType , provider .crs ())
45
+
28
46
inFeat = QgsFeature ()
29
47
outFeat = QgsFeature ()
30
48
inGeom = QgsGeometry ()
31
- nFeat = vprovider . featureCount ()
32
- nElement = 0
33
- while vprovider . nextFeature ( inFeat ):
34
- nElement += 1
35
- progress . setPercentage (( nElement * 100 ) / nFeat )
49
+
50
+ current = 0
51
+ total = 100.0 / float ( provider . featureCount ())
52
+
53
+ while layer . nextFeature ( inFeat ):
36
54
inGeom = inFeat .geometry ()
37
55
atMap = inFeat .attributeMap ()
38
- featList = self .extractAsSingle ( inGeom )
39
- outFeat .setAttributeMap ( atMap )
40
- for i in featList :
41
- outFeat .setGeometry ( i )
42
- writer .addFeature ( outFeat )
56
+
57
+ features = self .extractAsSingle (inGeom )
58
+ outFeat .setAttributeMap (atMap )
59
+
60
+ for f in features :
61
+ outFeat .setGeometry (f )
62
+ writer .addFeature (outFeat )
63
+
64
+ current += 1
65
+ progress .setPercentage (int (current * total ))
66
+
43
67
del writer
44
68
45
69
46
70
def multiToSingleGeom (self , wkbType ):
47
71
try :
48
72
if wkbType in (QGis .WKBPoint , QGis .WKBMultiPoint ,
49
- QGis .WKBPoint25D , QGis .WKBMultiPoint25D ):
73
+ QGis .WKBPoint25D , QGis .WKBMultiPoint25D ):
50
74
return QGis .WKBPoint
51
75
elif wkbType in (QGis .WKBLineString , QGis .WKBMultiLineString ,
52
- QGis .WKBMultiLineString25D , QGis .WKBLineString25D ):
76
+ QGis .WKBMultiLineString25D , QGis .WKBLineString25D ):
53
77
return QGis .WKBLineString
54
78
elif wkbType in (QGis .WKBPolygon , QGis .WKBMultiPolygon ,
55
- QGis .WKBMultiPolygon25D , QGis .WKBPolygon25D ):
79
+ QGis .WKBMultiPolygon25D , QGis .WKBPolygon25D ):
56
80
return QGis .WKBPolygon
57
81
else :
58
82
return QGis .WKBUnknown
59
83
except Exception , err :
60
- raise GeoAlgorithmExecutionException (str (err ))
84
+ raise GeoAlgorithmExecutionException (unicode (err ))
61
85
62
-
63
- def extractAsSingle ( self , geom ):
64
- multi_geom = QgsGeometry ()
65
- temp_geom = []
66
- if geom .type () == 0 :
86
+ def extractAsSingle (self , geom ):
87
+ multiGeom = QgsGeometry ()
88
+ geometries = []
89
+ if geom .type () == QGis .Point :
67
90
if geom .isMultipart ():
68
- multi_geom = geom .asMultiPoint ()
69
- for i in multi_geom :
70
- temp_geom .append ( QgsGeometry ().fromPoint ( i ) )
91
+ multiGeom = geom .asMultiPoint ()
92
+ for i in multiGeom :
93
+ geometries .append (QgsGeometry ().fromPoint ( i ) )
71
94
else :
72
- temp_geom .append ( geom )
73
- elif geom .type () == 1 :
95
+ geometries .append (geom )
96
+ elif geom .type () == QGis . Line :
74
97
if geom .isMultipart ():
75
- multi_geom = geom .asMultiPolyline ()
76
- for i in multi_geom :
77
- temp_geom .append ( QgsGeometry ().fromPolyline ( i ) )
98
+ multiGeom = geom .asMultiPolyline ()
99
+ for i in multiGeom :
100
+ geometries .append (QgsGeometry ().fromPolyline (i ) )
78
101
else :
79
- temp_geom .append ( geom )
80
- elif geom .type () == 2 :
102
+ geometries .append (geom )
103
+ elif geom .type () == QGis . Polygon :
81
104
if geom .isMultipart ():
82
- multi_geom = geom .asMultiPolygon ()
83
- for i in multi_geom :
84
- temp_geom .append ( QgsGeometry ().fromPolygon ( i ) )
105
+ multiGeom = geom .asMultiPolygon ()
106
+ for i in multiGeom :
107
+ geometries .append (QgsGeometry ().fromPolygon (i ) )
85
108
else :
86
- temp_geom .append ( geom )
87
- return temp_geom
88
-
89
-
90
- def defineCharacteristics (self ):
91
- self .name = "Multipart to singleparts"
92
- self .group = "Geometry tools"
93
- self .addParameter (ParameterVector (self .INPUT , "Input layer" ))
94
- self .addOutput (OutputVector (self .OUTPUT , "Output layer" ))
95
-
109
+ geometries .append (geom )
110
+ return geometries
0 commit comments