Skip to content

Commit 39ecc61

Browse files
committed
review Multi to single and Single to multi tools
1 parent 414f70c commit 39ecc61

File tree

2 files changed

+200
-169
lines changed

2 files changed

+200
-169
lines changed
Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
from sextante.core.GeoAlgorithm import GeoAlgorithm
21
import os.path
2+
33
from PyQt4 import QtGui
44
from PyQt4.QtCore import *
5-
from PyQt4.QtGui import *
5+
66
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
99
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
10+
from sextante.core.QGisLayers import QGisLayers
11+
12+
from sextante.parameters.ParameterVector import ParameterVector
13+
1014
from sextante.outputs.OutputVector import OutputVector
1115

1216
class MultipartToSingleparts(GeoAlgorithm):
@@ -17,79 +21,90 @@ class MultipartToSingleparts(GeoAlgorithm):
1721
def getIcon(self):
1822
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/multi_to_single.png")
1923

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+
2031
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+
2846
inFeat = QgsFeature()
2947
outFeat = QgsFeature()
3048
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):
3654
inGeom = inFeat.geometry()
3755
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+
4367
del writer
4468

4569

4670
def multiToSingleGeom(self, wkbType):
4771
try:
4872
if wkbType in (QGis.WKBPoint, QGis.WKBMultiPoint,
49-
QGis.WKBPoint25D, QGis.WKBMultiPoint25D):
73+
QGis.WKBPoint25D, QGis.WKBMultiPoint25D):
5074
return QGis.WKBPoint
5175
elif wkbType in (QGis.WKBLineString, QGis.WKBMultiLineString,
52-
QGis.WKBMultiLineString25D, QGis.WKBLineString25D):
76+
QGis.WKBMultiLineString25D, QGis.WKBLineString25D):
5377
return QGis.WKBLineString
5478
elif wkbType in (QGis.WKBPolygon, QGis.WKBMultiPolygon,
55-
QGis.WKBMultiPolygon25D, QGis.WKBPolygon25D):
79+
QGis.WKBMultiPolygon25D, QGis.WKBPolygon25D):
5680
return QGis.WKBPolygon
5781
else:
5882
return QGis.WKBUnknown
5983
except Exception, err:
60-
raise GeoAlgorithmExecutionException(str(err))
84+
raise GeoAlgorithmExecutionException(unicode(err))
6185

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:
6790
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))
7194
else:
72-
temp_geom.append( geom )
73-
elif geom.type() == 1:
95+
geometries.append(geom)
96+
elif geom.type() == QGis.Line:
7497
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))
78101
else:
79-
temp_geom.append( geom )
80-
elif geom.type() == 2:
102+
geometries.append(geom)
103+
elif geom.type() == QGis.Polygon:
81104
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))
85108
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

Comments
 (0)