He seleccionado una capa vectorial con atributos pendiente y área. Quiero combinar todas las características con pendiente 0 a 5, 5 a 10, ... , 85 a 90. Las características originales deben ser descartadas, y se deben crear nuevas características para cada categoría de pendiente (que consiste en la geometría combinada, y el atributo de área combinada).
Soy bastante nuevo en la programación en python, y aunque el script que he creado a continuación parece hacer lo que espero (?), tiene problemas de rendimiento. Comienza razonablemente rápido, pero luego se ralentiza a una velocidad dolorosamente lenta.
Me pregunto cuál es la razón de este comportamiento, y qué podría hacer mejor (y por qué).
import math
layer = iface.activeLayer()
for slope_cat_nr in range(1, 19):
print "Slope Category: ", slope_cat_nr*5
slope_max = 5*slope_cat_nr
slope_min = slope_max - 5
if slope_min == 0:
slope_min = -0.001
newGeom = QgsGeometry.fromWkt('GEOMETRYCOLLECTION()')
anzF = layer.featureCount()
onePercentAnz = math.ceil(anzF / 100)
print "Nr. of Features: ", anzF
progress = 0
fIds = []
for f in layer.getFeatures():
if (progress % onePercentAnz) == 0:
print (100*progress / anzF),
progress += 1
if f['slope'] > slope_min and f['slope'] <= slope_max:
newGeom = newGeom.combine(f.geometry())
fIds.append(f.id())
newFeature = QgsFeature(layer.pendingFields())
newFeature.setAttribute('slope', slope_max)
newFeature.setAttribute('area', newGeom.area())
print "New Area: ", newGeom.area()
newFeature.setGeometry(newGeom);
layer.dataProvider().addFeatures([newFeature])
layer.dataProvider().deleteFeatures(fIds)