[processing] fix Convex hull algorithm (fix #11725)

This commit is contained in:
Alexander Bruy 2014-11-30 11:31:36 +02:00
parent 7d8a3b1a29
commit 72fe56cfe4

View File

@ -50,24 +50,23 @@ class ConvexHull(GeoAlgorithm):
def defineCharacteristics(self): def defineCharacteristics(self):
self.name = 'Convex hull' self.name = 'Convex hull'
self.group = 'Vector geometry tools' self.group = 'Vector geometry tools'
self.addParameter(ParameterVector(ConvexHull.INPUT, 'Input layer', self.addParameter(ParameterVector(
[ParameterVector.VECTOR_TYPE_ANY])) self.INPUT, 'Input layer', [ParameterVector.VECTOR_TYPE_ANY]))
self.addParameter(ParameterTableField(ConvexHull.FIELD, self.addParameter(ParameterTableField(
'Field (optional, only used if creating convex hulls by classes)', self.FIELD,
ConvexHull.INPUT, optional=True)) 'Field (optional, only used if creating convex hulls by classes)',
self.addParameter(ParameterSelection(ConvexHull.METHOD, 'Method', self.INPUT, optional=True))
ConvexHull.METHODS)) self.addParameter(ParameterSelection(
self.addOutput(OutputVector(ConvexHull.OUTPUT, 'Convex hull')) self.METHOD, 'Method', self.METHODS))
self.addOutput(OutputVector(self.OUTPUT, 'Convex hull'))
def processAlgorithm(self, progress): def processAlgorithm(self, progress):
useField = self.getParameterValue(ConvexHull.METHOD) == 1
fieldName = self.getParameterValue(ConvexHull.FIELD)
layer = dataobjects.getObjectFromUri( layer = dataobjects.getObjectFromUri(
self.getParameterValue(ConvexHull.INPUT)) self.getParameterValue(self.INPUT))
useField = self.getParameterValue(self.METHOD) == 1
fieldName = self.getParameterValue(self.FIELD)
f = QgsField('value') f = QgsField('value')
f.setType(QVariant.String)
f.setLength(255)
if useField: if useField:
index = layer.fieldNameIndex(fieldName) index = layer.fieldNameIndex(fieldName)
fType = layer.pendingFields()[index].type() fType = layer.pendingFields()[index].type()
@ -82,14 +81,14 @@ class ConvexHull(GeoAlgorithm):
f.setType(QVariant.String) f.setType(QVariant.String)
f.setLength(255) f.setLength(255)
fields = [QgsField('id', QVariant.Int, '', 20), f, QgsField('area', fields = [QgsField('id', QVariant.Int, '', 20),
QVariant.Double, '', 20, 6), QgsField('perim', f,
QVariant.Double, '', 20, 6)] QgsField('area', QVariant.Double, '', 20, 6),
QgsField('perim', QVariant.Double, '', 20, 6)
]
writer = self.getOutputFromName( writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
ConvexHull.OUTPUT).getVectorWriter(fields, fields, QGis.WKBPolygon, layer.dataProvider().crs())
QGis.WKBPolygon,
layer.dataProvider().crs())
outFeat = QgsFeature() outFeat = QgsFeature()
inGeom = QgsGeometry() inGeom = QgsGeometry()
@ -98,21 +97,22 @@ class ConvexHull(GeoAlgorithm):
current = 0 current = 0
fid = 0 fid = 0
val = '' val = None
features = vector.features(layer)
if useField: if useField:
unique = layer.uniqueValues(index) unique = layer.uniqueValues(index)
total = 100.0 / float(layer.featureCount() * len(unique)) total = 100.0 / (len(features) * len(unique))
for i in unique: for i in unique:
hull = []
first = True first = True
hull = []
features = vector.features(layer) features = vector.features(layer)
for f in features: for f in features:
idVar = f[fieldName] idVar = f[fieldName]
if unicode(idVar).strip() == unicode(i).strip: if unicode(idVar).strip() == unicode(i).strip():
if first: if first:
val = idVar val = idVar
first = False first = False
inGeom = QgsGeometry(f.geometry()) inGeom = QgsGeometry(f.geometry())
points = vector.extractPoints(inGeom) points = vector.extractPoints(inGeom)
hull.extend(points) hull.extend(points)